Home  >  Article  >  Backend Development  >  php_二维数组排序

php_二维数组排序

WBOY
WBOYOriginal
2016-06-06 20:37:011125browse

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

<code><?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;
    }
</code>

回复内容:

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

<code><?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;
    }
</code>

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

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

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

<code>    array_multisort(array1,sorting order,sorting type,array2,array3...)
</code>

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

<code>    <?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;
    }
</code>

不知道我说清楚了没有?

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

<code><?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']) </code>

/**

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

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

  • @params string $field 排序的字段

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

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

<code>$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;</code>

}

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn