##就是這個數組,用了array_values 發現好像被重新排序了按照ID impolde提示數組不能當參數,對像也用了,json 也轉了。到底該怎麼去呢
更新:
#這樣已經可以了,但是我新的retlist 0 arrary_colum 之後,打印的結果[0]卻跑到數組最後去了。
代言2017-06-23 09:13:13
首先,你這個資料格式是JSON的,要先轉成PHP數組。
$a = json_decode($a, TRUE);
json_decode
第二個參數為TRUE
表示保留鍵名,否則JSON轉PHP數組之後,PHP數組的鍵名會重新排序。
接著將你資料中的$a['data']
值用array_column
處理,或使用array_values
,將陣列值重排。
$a['Data'] = array_column($a['Data'], NULL);
// 或者
$a['Data'] = array_values($a['Data']);
Data
中Data
為數組[]
。 只要在PHP數組中,先按照上面的array_column
或array_values
處理過$a['Data']
,然後直接運行
$a = json_encode($a);
注意json_encode
第二個參數絕對不能用JSON_FORCE_OBJECT
,否則還是會讓Data變成物件{}
。
看了你的程式碼,我好像知道你要幹啥了,你是想找出原數組裡ID值和$makeupId
相等的項,然後把它提前到數組第一個?如果是這樣你的程式碼寫複雜了。透過array_column()
這個神奇的函數,可以輕鬆實現你的需求。程式碼如下
$newarr = [];
$ret = array_column($ret, NULL, 'ID');
# 上面这行代码做了一个神奇的事情,就是将源代码的顺序保持不变,然后将ID作为了键值,
# 生成了一个关联数组。
#
# 下面简单讲一下array_column的神奇之处,它可以将像你这种数据格式的
# 二维数组(矩阵型二维数组)中的某一列拆出来,作为键值,另外一列拆出来作为键名,
# 形成关联数组。
#
# 当然,这个函数的定义array_column($source, $value_field[, $key_field]);
# 其中,
# $source为源数组,
# $value_field为需要提取作为键值的名字,如果为NULL则将整个内层数组作为值
# (也就是保持原来的值不变,这个一般用于数组键名的重新生成)
# $key_field为需要提取作为键名的名字,此处为'ID',如果为NULL或者省略,
# 则会重新从0开始编号(配合上面$value_field为NULL可以重新排序数组)
#
# 然后给个简单说明:
# $a = [
# 't' => ['id' => 1, 'name' => 'a'],
# 'u' => ['id' => 2, 'name' => 'b']
# ];
#
# 通过array_column($a, NULL)得到的是
# $a = [
# ['id' => 1, 'name' => 'a'],
# ['id' => 2, 'name' => 'b']
# ];
#
# 通过array_column($a, 'id')得到的是
# $a = [1, 2];
#
# 通过array_column($a, NULL, 'id')得到的是
# $a = [
# 1 => ['id' => 1, 'name' => 'a'],
# 2 => ['id' => 2, 'name' => 'b']
# ];
#
# 通过array_column($a, 'name', 'id')得到的是
# $a = [
# 1 => 'a'
# 2 => 'b'
# ];
# 说了这么多你应该理解了这个函数的用法,上面那句
# $ret = array_column($ret, NULL, 'ID')将$ret变成了关联数组,
# 这样$ret[$makeupId]就可以直接找到你需要提取的项了,是不是很方便?
#
# 下面接着给代码
if(!empty($ret[$makeupId])) {
$newarr = $ret[$makeupId]; // 取出新对象
unset($ret[$makeupId]); // 删除原有数组中的对象
}
$ret = array_column($ret, NULL);
# 上面这行将关联数组再转回了顺序数组,但是别忘了,
# 因为满足$makeupId的项被取到了$newarr,然后原数组中的$makeupId项被删掉,
# 所以转回来的数组是不含满足$makeupId的项的。
# 接下来,将$newarr推到数组之前,
# 此处注意,array_unshift()方法直接操作原数组,所以不需要赋值
array_unshift($ret, $newarr);
代碼結束
然後,我再說一下,為什麼你用array_values()
和array_column()
都會使順序變亂。因為這兩個函數都是會重新編號的,而且它編號的順序,不是你鍵名的標籤順序,也就是說你鍵名手動寫成0,1,2,3
並不會使它重新編號時間依照0,1,2,3
排序。它重新編號的順序取決於你程式碼運行的順序。也就是說,你最後那個...[0] = $newarr,其實不是在數組開頭,而是在整個數組的尾部,只是它的鍵名為0而已,所以你無論怎麼努力,這個0對應的元素都是會跑到最後的。
上面程式碼裡註解解說比較多,這裡貼一下純程式碼:
$newarr = [];
$ret = array_column($ret, NULL, 'ID');
if(!empty($ret[$makeupId])) {
$newarr = $ret[$makeupId]; // 取出新对象
unset($ret[$makeupId]); // 删除原有数组中的对象
}
$ret = array_column($ret, NULL);
array_unshift($ret, $newarr);
var_dump($ret);
再補充點內容吧,以下是除了array_column
的幾個可行的解決方案。
這個方案是基於你原有程式碼修改。
在你的程式碼倒數第二行($retlist = ...
上面)加上
ksort($ret_list, SORT_NUMERIC);
這個方案也是基於你原有程式碼修改。
將你程式碼中的$retlist[0] = $newarr;
改為array_unshift($retlist, $newarr);
上面已經說過,array_column
和array_values
都會重新編號,重新編號的順序取決於你定義對應值的順序,而並非是鍵名的數字順序,所以上面這個修改,是用數組頭部推入項替代$retlist[0]
的值定義與初始化。
這個也是基於你程式碼修改的。
在你遍歷之前,先定義好$retlist[0] = []
,然後當你遍歷到符合$makeupId
項的時候,直接賦值為$retlist[0]
,這樣,由於事先定義了$retlist[0]
,所以就算重新編號,它的順序也是在第一個的。