• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php_二维数组排序

php 搞代码 4年前 (2022-01-25) 11次浏览 已收录 0个评论
文章目录[隐藏]

请讲解一下这段排序的原理,特别是引用赋值那里是怎么回事,谢谢。
//按照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 的元素。

加上@本文来源gaodai$ma#com搞$代*码6网搞代gaodaima码&的遍历则不同了,可以认为这时遍历的临时数组$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']) < strlen($b['name']) ? -1 : 1;});//修改key$arr1 = [];array_walk($arr, function ($v,$k) use (&$arr1){    $arr1[$k+1] = $v;});var_dump($arr1);</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>

}


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php_二维数组排序

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址