検索

ホームページ  >  に質問  >  本文

php_二维数组排序

请讲解一下这段排序的原理,特别是引用赋值那里是怎么回事,谢谢。
//按照name的长度排序,id从1开始;

<?php
    $arr = array(

    array('id' => 0, 'name' => '12'),
    array('id' => 0, 'name' => 'ada'),
    array('id' => 0, 'name' => 'asdfsdf'),
    array('id' => 0, 'name' => '10sdf'),
    array('id' => 0, 'name' => 'aasdfbc')

);

foreach($arr as $key=>$value) {
    $long[$key] = strlen($value['name']);
}
    array_multisort($long,SORT_ASC,$arr);

    $i = 1;
    foreach($arr as &$value){   
        $value['id']=$i;
        $i++;
        $arr[]+$value;
    }
阿神阿神2894日前375

全員に返信(3)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:29:00

    谢邀(虽然你没要请我(┬_┬))。
    首先你要搞懂什么是 array_multisort()
    PHP array_multisort

    当然,你看看就得了,看不明白是正常的。

    那么 我用简洁的语言讲一下 什么是array_multisort()

        array_multisort(array1,sorting order,sorting type,array2,array3...)
    

    我们清楚的看到 上面有array1 array2 array3.....(sorting order,sorting type先不说)
    array1,我们把它看作是编号
    array2,array3....我们把他看作数组。
    当我们使用array_multisort的时候,实际上array1,array2,array3... 中的所有元素就一一对应了
    强调一遍,是一一对应!!!(所以,不允许出现数组元素不一样的情况)
    然后,排列array1,后面的array2 array3...就跟随着array1进行排列。array1就是他们的id。

        <?php
    //这个就是array2
    $arr = array(
         array('id' => 0, 'name' => '12'),
        array('id' => 0, 'name' => 'ada'),
        array('id' => 0, 'name' => 'asdfsdf'),
        array('id' => 0, 'name' => '10sdf'),
        array('id' => 0, 'name' => 'aasdfbc')
    
    );
    //这个是array1 换句话说,他就是数组的id,其他数组的排列是随着他的
    foreach($arr as $key=>$value) {
        $long[$key] = strlen($value['name']);
    }
    //排序开始
    array_multisort($long,SORT_ASC,$arr);
        $i = 1;
    //剩下就是foreach了
        foreach($arr as &$value){   
            $value['id']=$i;
            $i++;
            $arr[] = $value;
        }
    

    不知道我说清楚了没有?

    返事
    0
  • 黄舟

    黄舟2017-04-10 15:29:00

    foreach官方文档

    可以很容易地通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

    不加&的 foreach 可以理解为拷贝一份数组 $arr_tmp ,然后遍历 $arr_tmp ,遍历中的 $value 是临时数组 $arr_tmp 的元素,而不是 $arr 的元素。

    加上&的遍历则不同了,可以认为这时遍历的临时数组$arr_tmp的每个元素,都是$arr中元素的引用,这时在 foreach 中修改 $value ,是通过引用修改了 $arr 中的元素数值。

    array_multisort很少用了吧,多维数组排序一般习惯用 usort ,你这修改key的需求也是有点奇葩
    那个foreach里参数使用引用也不建议使用,因为foreach完毕后$value是不销毁的 ,需要unset掉,文档中也有强调。

    http://3v4l.org/hBnIE

    <?php
    $arr = [
        ['id' => 0, 'name' => '10sdf'],
        ['id' => 0, 'name' => '12'],
        ['id' => 0, 'name' => 'aasdfbc'],
        ['id' => 0, 'name' => 'ada'],
        ['id' => 0, 'name' => 'asdfsdf'],
    ];
    //排序
    usort($arr, function ($a, $b) {
        if (strlen($a['name']) == strlen($b['name'])) return 0;
        return strlen($a['name']) < strlen($b['name']) ? -1 : 1;
    });
    //修改key
    $arr1 = [];
    array_walk($arr, function ($v,$k) use (&$arr1){
        $arr1[$k+1] = $v;
    });
    var_dump($arr1);
    

    返事
    0
  • 高洛峰

    高洛峰2017-04-10 15:29:00

    /**

    • 二维数组根据字段进行排序

    • @params array $array 需要排序的数组

    • @params string $field 排序的字段

    • @params string $sort 排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
      */

    function arraySequence($array, $field, $sort = 'SORT_DESC')
    {

    $arrSort = array();
    foreach ($array as $uniqid => $row) {
        foreach ($row as $key => $value) {
            $arrSort[$key][$uniqid] = $value;
        }
    }
    array_multisort($arrSort[$field], constant($sort), $array);
    return $array;

    }

    返事
    0
  • キャンセル返事