php 去掉多维数组的键名,去除多维数组的最外层key 保留值
如果你是要將JSON轉成PHP數組,方法如下
首先,你這個數據格式是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']);
如果你是要將PHP轉成JSON,但是要使Data中Data為數組[]。
只要在PHP數組中,先按照上面的array_column或者array_values處理過$a['Data'],然后直接運行
$a = json_encode($a);
注意json_encode第二個參數絕對不能用JSON_FORCE_OBJECT,否則還是會使Data變為對象{}。
Update
看了你的代碼,我好像是知道你要干啥了,你是想找出原數組里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對應的元素都是會跑到最后的。
Update 2
上面代碼里注釋解說比較多,這里貼一下純代碼:
$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);
Update 3
再補充點內容吧,下面是除了array_column的幾個可行的解決方案。
方案1:
這個方案基于你原有代碼修改。
在你的代碼倒數第二行($retlist = ...上面)加上
ksort($ret_list, SORT_NUMERIC);
方案2:
這個方案也是基于你原有代碼修改。
將你代碼中的$retlist[0] = $newarr;改為array_unshift($retlist, $newarr);
上面已經說過,array_column和array_values都會重新編號,重新編號的順序取決于你定義對應值的順序,而并非是鍵名的數字順序,所以上面這個修改,是用數組頭部推入項替代$retlist[0]的值定義和初始化。
方案3:
這個也是基于你代碼修改的。
在你遍歷之前,先定義好$retlist[0] = [],然后當你遍歷到符合$makeupId項的時候,直接賦值給$retlist[0],這樣,由于事先定義了$retlist[0],所以就算重新編號,它的順序也是在第一個的。
總結
以上是生活随笔為你收集整理的php 去掉多维数组的键名,去除多维数组的最外层key 保留值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基础,DDL和DML(新人入门
- 下一篇: linux 7 nano,Linux初學