php 去掉多维数组的键名,去除多维数组的最外层key 保留值
如果你是要將JSON轉(zhuǎn)成PHP數(shù)組,方法如下
首先,你這個(gè)數(shù)據(jù)格式是JSON的,要先轉(zhuǎn)成PHP數(shù)組。
$a = json_decode($a, TRUE);
json_decode第二個(gè)參數(shù)為TRUE表示保留鍵名,否則JSON轉(zhuǎn)PHP數(shù)組之后,PHP數(shù)組的鍵名會(huì)重新排序。
然后將你數(shù)據(jù)中的$a['data']值用array_column處理,或者使用array_values,將數(shù)組值重排。
$a['Data'] = array_column($a['Data'], NULL);
// 或者
$a['Data'] = array_values($a['Data']);
如果你是要將PHP轉(zhuǎn)成JSON,但是要使Data中Data為數(shù)組[]。
只要在PHP數(shù)組中,先按照上面的array_column或者array_values處理過(guò)$a['Data'],然后直接運(yùn)行
$a = json_encode($a);
注意json_encode第二個(gè)參數(shù)絕對(duì)不能用JSON_FORCE_OBJECT,否則還是會(huì)使Data變?yōu)閷?duì)象{}。
Update
看了你的代碼,我好像是知道你要干啥了,你是想找出原數(shù)組里ID值和$makeupId相等的項(xiàng),然后把它提前到數(shù)組第一個(gè)?如果是這樣你的代碼寫(xiě)復(fù)雜了。通過(guò)array_column()這個(gè)神奇的函數(shù),可以輕松實(shí)現(xiàn)你的需求。代碼如下
$newarr = [];
$ret = array_column($ret, NULL, 'ID');
# 上面這行代碼做了一個(gè)神奇的事情,就是將源代碼的順序保持不變,然后將ID作為了鍵值,
# 生成了一個(gè)關(guān)聯(lián)數(shù)組。
#
# 下面簡(jiǎn)單講一下array_column的神奇之處,它可以將像你這種數(shù)據(jù)格式的
# 二維數(shù)組(矩陣型二維數(shù)組)中的某一列拆出來(lái),作為鍵值,另外一列拆出來(lái)作為鍵名,
# 形成關(guān)聯(lián)數(shù)組。
#
# 當(dāng)然,這個(gè)函數(shù)的定義array_column($source, $value_field[, $key_field]);
# 其中,
# $source為源數(shù)組,
# $value_field為需要提取作為鍵值的名字,如果為NULL則將整個(gè)內(nèi)層數(shù)組作為值
# (也就是保持原來(lái)的值不變,這個(gè)一般用于數(shù)組鍵名的重新生成)
# $key_field為需要提取作為鍵名的名字,此處為'ID',如果為NULL或者省略,
# 則會(huì)重新從0開(kāi)始編號(hào)(配合上面$value_field為NULL可以重新排序數(shù)組)
#
# 然后給個(gè)簡(jiǎn)單說(shuō)明:
# $a = [
# 't' => ['id' => 1, 'name' => 'a'],
# 'u' => ['id' => 2, 'name' => 'b']
# ];
#
# 通過(guò)array_column($a, NULL)得到的是
# $a = [
# ['id' => 1, 'name' => 'a'],
# ['id' => 2, 'name' => 'b']
# ];
#
# 通過(guò)array_column($a, 'id')得到的是
# $a = [1, 2];
#
# 通過(guò)array_column($a, NULL, 'id')得到的是
# $a = [
# 1 => ['id' => 1, 'name' => 'a'],
# 2 => ['id' => 2, 'name' => 'b']
# ];
#
# 通過(guò)array_column($a, 'name', 'id')得到的是
# $a = [
# 1 => 'a'
# 2 => 'b'
# ];
# 說(shuō)了這么多你應(yīng)該理解了這個(gè)函數(shù)的用法,上面那句
# $ret = array_column($ret, NULL, 'ID')將$ret變成了關(guān)聯(lián)數(shù)組,
# 這樣$ret[$makeupId]就可以直接找到你需要提取的項(xiàng)了,是不是很方便?
#
# 下面接著給代碼
if(!empty($ret[$makeupId])) {
$newarr = $ret[$makeupId]; // 取出新對(duì)象
unset($ret[$makeupId]); // 刪除原有數(shù)組中的對(duì)象
}
$ret = array_column($ret, NULL);
# 上面這行將關(guān)聯(lián)數(shù)組再轉(zhuǎn)回了順序數(shù)組,但是別忘了,
# 因?yàn)闈M足$makeupId的項(xiàng)被取到了$newarr,然后原數(shù)組中的$makeupId項(xiàng)被刪掉,
# 所以轉(zhuǎn)回來(lái)的數(shù)組是不含滿足$makeupId的項(xiàng)的。
# 接下來(lái),將$newarr推到數(shù)組之前,
# 此處注意,array_unshift()方法直接操作原數(shù)組,所以不需要賦值
array_unshift($ret, $newarr);
代碼結(jié)束
然后,我再說(shuō)一下,為什么你用array_values()和array_column()都會(huì)使順序變亂。因?yàn)檫@兩個(gè)函數(shù)都是會(huì)重新編號(hào)的,而且它編號(hào)的順序,不是你鍵名的標(biāo)簽順序,也就是說(shuō)你鍵名手動(dòng)寫(xiě)成0,1,2,3并不會(huì)使它重新編號(hào)時(shí)候按照0,1,2,3排序。它重新編號(hào)的順序取決于你代碼運(yùn)行的順序。也就是說(shuō),你最后那個(gè)...[0] = $newarr,其實(shí)并不是在數(shù)組開(kāi)頭,而是在整個(gè)數(shù)組的尾部,只是它的鍵名為0而已,所以你無(wú)論怎么努力,這個(gè)0對(duì)應(yīng)的元素都是會(huì)跑到最后的。
Update 2
上面代碼里注釋解說(shuō)比較多,這里貼一下純代碼:
$newarr = [];
$ret = array_column($ret, NULL, 'ID');
if(!empty($ret[$makeupId])) {
$newarr = $ret[$makeupId]; // 取出新對(duì)象
unset($ret[$makeupId]); // 刪除原有數(shù)組中的對(duì)象
}
$ret = array_column($ret, NULL);
array_unshift($ret, $newarr);
var_dump($ret);
Update 3
再補(bǔ)充點(diǎn)內(nèi)容吧,下面是除了array_column的幾個(gè)可行的解決方案。
方案1:
這個(gè)方案基于你原有代碼修改。
在你的代碼倒數(shù)第二行($retlist = ...上面)加上
ksort($ret_list, SORT_NUMERIC);
方案2:
這個(gè)方案也是基于你原有代碼修改。
將你代碼中的$retlist[0] = $newarr;改為array_unshift($retlist, $newarr);
上面已經(jīng)說(shuō)過(guò),array_column和array_values都會(huì)重新編號(hào),重新編號(hào)的順序取決于你定義對(duì)應(yīng)值的順序,而并非是鍵名的數(shù)字順序,所以上面這個(gè)修改,是用數(shù)組頭部推入項(xiàng)替代$retlist[0]的值定義和初始化。
方案3:
這個(gè)也是基于你代碼修改的。
在你遍歷之前,先定義好$retlist[0] = [],然后當(dāng)你遍歷到符合$makeupId項(xiàng)的時(shí)候,直接賦值給$retlist[0],這樣,由于事先定義了$retlist[0],所以就算重新編號(hào),它的順序也是在第一個(gè)的。
總結(jié)
以上是生活随笔為你收集整理的php 去掉多维数组的键名,去除多维数组的最外层key 保留值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL基础,DDL和DML(新人入门
- 下一篇: linux 7 nano,Linux初學