cari

Rumah  >  Soal Jawab  >  teks badan

php - Keluarkan kunci paling luar tatasusunan berbilang dimensi dan kekalkan nilainya

Ini ialah tatasusunan Selepas menggunakan array_values, saya mendapati bahawa ia nampaknya telah disusun semula mengikut gesaan ID impolde bahawa tatasusunan tidak boleh digunakan sebagai parameter, objek juga digunakan, dan json juga ditukar. Bagaimana saya harus pergi?

Kemas kini:

Ini sudah memadai, tetapi selepas senarai semula baharu saya 0 array_colum, hasil cetakan [0] pergi ke penghujung tatasusunan.

phpcn_u1582phpcn_u15822720 hari yang lalu2522

membalas semua(3)saya akan balas

  • 代言

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

    Jika anda ingin menukar JSON kepada tatasusunan PHP, kaedahnya adalah seperti berikut

    Pertama sekali, format data anda ialah JSON, yang perlu ditukar kepada tatasusunan PHP terlebih dahulu.

    $a = json_decode($a, TRUE);

    json_decode第二个参数为TRUE bermaksud mengekalkan nama kunci, jika tidak selepas JSON ditukar kepada tatasusunan PHP, nama kunci tatasusunan PHP akan disusun semula.

    Kemudian $a['data']值用array_column处理,或者使用array_values dalam data anda dan susun semula nilai tatasusunan.

    $a['Data'] = array_column($a['Data'], NULL);
    // 或者
    $a['Data'] = array_values($a['Data']);

    Jika anda ingin menukar PHP kepada JSON, tetapi gunakan DataData为数组[].

    Selagi dalam tatasusunan PHP, ikuti di atas array_column或者array_values处理过$a['Data'] dahulu, dan kemudian jalankan terus

    $a = json_encode($a);

    Perhatianjson_encode第二个参数绝对不能用JSON_FORCE_OBJECT,否则还是会使Data变为对象{}.

    Kemas kini

    Selepas membaca kod anda, saya nampaknya tahu apa yang anda mahu lakukan. Anda ingin mengetahui nilai ID dalam tatasusunan asal dan $makeupId相等的项,然后把它提前到数组第一个?如果是这样你的代码写复杂了。通过array_column()Fungsi ajaib ini boleh mencapai keperluan anda dengan mudah. Kodnya adalah seperti berikut

    $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);

    Tamat kod


    Kemudian, izinkan saya membincangkannya sekali lagi, mengapa anda menggunakan array_values()array_column()都会使顺序变乱。因为这两个函数都是会重新编号的,而且它编号的顺序,不是你键名的标签顺序,也就是说你键名手动写成0,1,2,3并不会使它重新编号时候按照0,1,2,3 untuk mengisih. Tertib dinomborkan semula bergantung pada susunan kod anda dijalankan. Dalam erti kata lain, terakhir anda...[0] = $newarr sebenarnya bukan pada permulaan tatasusunan, tetapi pada penghujung keseluruhan tatasusunan Cuma nama kuncinya ialah 0, jadi tidak kira betapa sukarnya anda mencuba , ini 0 sepadan dengan Elemen semua akan berjalan hingga akhir.


    Kemas kini 2

    Terdapat banyak komen dan penjelasan dalam kod di atas, berikut adalah kod tulen:

    $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);

    Kemas kini 3

    Mari tambah beberapa lagi kandungan Di bawah adalah beberapa penyelesaian yang boleh dilaksanakan selain array_column.

    Pilihan 1:

    Penyelesaian ini adalah berdasarkan pengubahsuaian kod asal anda.
    Tambahkan $retlist = ... pada baris kedua hingga terakhir kod anda (di atas

    )
    ksort($ret_list, SORT_NUMERIC);

    Pilihan 2:

    Penyelesaian ini juga berdasarkan pengubahsuaian kod asal anda.
    Tukar $retlist[0] = $newarr;改为array_unshift($retlist, $newarr);

    dalam kod anda

    Seperti yang dinyatakan di atas, array_columnarray_values都会重新编号,重新编号的顺序取决于你定义对应值的顺序,而并非是键名的数字顺序,所以上面这个修改,是用数组头部推入项替代$retlist[0] dan array_values akan dinomborkan semula Susunan penomboran semula bergantung pada susunan di mana anda mentakrifkan nilai yang sepadan, bukan susunan berangka nama kunci, jadi pengubahsuaian di atas adalah untuk. gunakan tatasusunan Item tolak pengepala menggantikan definisi nilai dan permulaan $retlist[0].

    Pilihan 3:

    Ini juga diubah suai berdasarkan kod anda.
    Sebelum anda melintasi, tentukan $retlist[0] = [],然后当你遍历到符合$makeupId项的时候,直接赋值给$retlist[0],这样,由于事先定义了$retlist[0] dahulu, jadi walaupun dinomborkan semula, susunannya tetap menjadi yang pertama.

    balas
    0
  • 滿天的星座

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

    Adakah ini bermakna bahawa hanya mengalih keluar nilai kunci adalah sama dengan mengalih keluar satu lapisan tatasusunan berbilang dimensi? Jika ya, saya menulis contoh kasar Anda boleh mengikuti idea ini untuk melaksanakannya, seperti yang ditunjukkan dalam gambar di atas

    .

    balas
    0
  • 欧阳克

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

    Sebaik-baiknya menukar data json kepada tatasusunan php untuk pemprosesan yang lebih mudah. Jika tidak, ia akan menjadi sukar untuk ditangani.

    balas
    0
  • Batalbalas