Home > Article > Backend Development > php_二维数组排序
请讲解一下这段排序的原理,特别是引用赋值那里是怎么回事,谢谢。
//按照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>
}