php - 移除多維數組的最外層key 保留值
phpcn_u1582
phpcn_u1582 2017-06-23 09:11:13
0
3
2484

##就是這個數組,用了array_values 發現好像被重新排序了按照ID impolde提示數組不能當參數,對像也用了,json 也轉了。到底該怎麼去呢

更新:

#這樣已經可以了,但是我新的retlist 0 arrary_colum 之後,打印的結果[0]卻跑到數組最後去了。

phpcn_u1582
phpcn_u1582

全部回覆(3)
代言

如果你要將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,但是要讓DataData為數組[]

只要在PHP數組中,先按照上面的array_columnarray_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_columnarray_values都會重新編號,重新編號的順序取決於你定義對應值的順序,而並非是鍵名的數字順序,所以上面這個修改,是用數組頭部推入項替代$retlist[0]的值定義與初始化。

方案3:

這個也是基於你程式碼修改的。
在你遍歷之前,先定義好$retlist[0] = [],然後當你遍歷到符合$makeupId項的時候,直接賦值為$retlist[0],這樣,由於事先定義了$retlist[0],所以就算重新編號,它的順序也是在第一個的。

滿天的星座

是不是這個意思,就是光把鍵值去掉,相當於把多維數組去掉一層。如果是的話我寫了一個大概的例子,你可以照著這個思路去實現一下,上圖

学霸

json資料最好轉換成php數組才好處理。不然很難處理的。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!