搜尋

首頁  >  問答  >  主體

php - 移除多維數組的最外層key 保留值

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

更新:

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

phpcn_u1582phpcn_u15822720 天前2520

全部回覆(3)我來回復

  • 代言

    代言2017-06-23 09:13:13

    如果你要將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],所以就算重新編號,它的順序也是在第一個的。

    回覆
    0
  • 滿天的星座

    滿天的星座2017-06-23 09:13:13

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

    回覆
    0
  • 欧阳克

    欧阳克2017-06-23 09:13:13

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

    回覆
    0
  • 取消回覆