84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
##就是這個數組,用了array_values 發現好像被重新排序了按照ID impolde提示數組不能當參數,對像也用了,json 也轉了。到底該怎麼去呢
更新:
#這樣已經可以了,但是我新的retlist 0 arrary_colum 之後,打印的結果[0]卻跑到數組最後去了。
首先,你這個資料格式是JSON的,要先轉成PHP數組。
$a = json_decode($a, TRUE);
json_decode第二個參數為TRUE表示保留鍵名,否則JSON轉PHP數組之後,PHP數組的鍵名會重新排序。
json_decode
TRUE
接著將你資料中的$a['data']值用array_column處理,或使用array_values,將陣列值重排。
$a['data']
array_column
array_values
$a['Data'] = array_column($a['Data'], NULL); // 或者 $a['Data'] = array_values($a['Data']);
Data
[]
只要在PHP數組中,先按照上面的array_column或array_values處理過$a['Data'],然後直接運行
$a['Data']
$a = json_encode($a);
注意json_encode第二個參數絕對不能用JSON_FORCE_OBJECT,否則還是會讓Data變成物件{}。
json_encode
JSON_FORCE_OBJECT
{}
看了你的程式碼,我好像知道你要幹啥了,你是想找出原數組裡ID值和$makeupId相等的項,然後把它提前到數組第一個?如果是這樣你的程式碼寫複雜了。透過array_column()這個神奇的函數,可以輕鬆實現你的需求。程式碼如下
$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對應的元素都是會跑到最後的。
array_values()
0,1,2,3
上面程式碼裡註解解說比較多,這裡貼一下純程式碼:
$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 = ...上面)加上
$retlist = ...
ksort($ret_list, SORT_NUMERIC);
這個方案也是基於你原有程式碼修改。 將你程式碼中的$retlist[0] = $newarr;改為array_unshift($retlist, $newarr);
$retlist[0] = $newarr;
array_unshift($retlist, $newarr);
上面已經說過,array_column和array_values都會重新編號,重新編號的順序取決於你定義對應值的順序,而並非是鍵名的數字順序,所以上面這個修改,是用數組頭部推入項替代$retlist[0]的值定義與初始化。
$retlist[0]
這個也是基於你程式碼修改的。 在你遍歷之前,先定義好$retlist[0] = [],然後當你遍歷到符合$makeupId項的時候,直接賦值為$retlist[0],這樣,由於事先定義了$retlist[0],所以就算重新編號,它的順序也是在第一個的。
$retlist[0] = []
是不是這個意思,就是光把鍵值去掉,相當於把多維數組去掉一層。如果是的話我寫了一個大概的例子,你可以照著這個思路去實現一下,上圖
json資料最好轉換成php數組才好處理。不然很難處理的。
如果你要將JSON轉換成PHP數組,方法如下
首先,你這個資料格式是JSON的,要先轉成PHP數組。
json_decode
第二個參數為TRUE
表示保留鍵名,否則JSON轉PHP數組之後,PHP數組的鍵名會重新排序。接著將你資料中的
$a['data']
值用array_column
處理,或使用array_values
,將陣列值重排。如果你要將PHP轉換成JSON,但是要讓
Data
中Data
為數組[]
。只要在PHP數組中,先按照上面的
array_column
或array_values
處理過$a['Data']
,然後直接運行注意
json_encode
第二個參數絕對不能用JSON_FORCE_OBJECT
,否則還是會讓Data變成物件{}
。Update
看了你的程式碼,我好像知道你要幹啥了,你是想找出原數組裡ID值和
$makeupId
相等的項,然後把它提前到數組第一個?如果是這樣你的程式碼寫複雜了。透過array_column()
這個神奇的函數,可以輕鬆實現你的需求。程式碼如下代碼結束
然後,我再說一下,為什麼你用
array_values()
和array_column()
都會使順序變亂。因為這兩個函數都是會重新編號的,而且它編號的順序,不是你鍵名的標籤順序,也就是說你鍵名手動寫成0,1,2,3
並不會使它重新編號時間依照0,1,2,3
排序。它重新編號的順序取決於你程式碼運行的順序。也就是說,你最後那個...[0] = $newarr,其實不是在數組開頭,而是在整個數組的尾部,只是它的鍵名為0而已,所以你無論怎麼努力,這個0對應的元素都是會跑到最後的。Update 2
上面程式碼裡註解解說比較多,這裡貼一下純程式碼:
Update 3
再補充點內容吧,以下是除了
array_column
的幾個可行的解決方案。方案1:
這個方案是基於你原有程式碼修改。
在你的程式碼倒數第二行(
$retlist = ...
上面)加上方案2:
這個方案也是基於你原有程式碼修改。
將你程式碼中的
$retlist[0] = $newarr;
改為array_unshift($retlist, $newarr);
上面已經說過,
array_column
和array_values
都會重新編號,重新編號的順序取決於你定義對應值的順序,而並非是鍵名的數字順序,所以上面這個修改,是用數組頭部推入項替代$retlist[0]
的值定義與初始化。方案3:
這個也是基於你程式碼修改的。
在你遍歷之前,先定義好
$retlist[0] = []
,然後當你遍歷到符合$makeupId
項的時候,直接賦值為$retlist[0]
,這樣,由於事先定義了$retlist[0]
,所以就算重新編號,它的順序也是在第一個的。是不是這個意思,就是光把鍵值去掉,相當於把多維數組去掉一層。如果是的話我寫了一個大概的例子,你可以照著這個思路去實現一下,上圖
json資料最好轉換成php數組才好處理。不然很難處理的。