如何在多维数组上使用array_multisort()函数

4

如果你在寻找对多维数组进行排序的正确函数,可以参考以下内容:

Array(    [0] => Array      (
             [username]    => 123           
             [name]        => Name    
             [address]     => array  (
                                 [line1]    => address line 1
                                 [line2]    => address line 2
                                 [postcode] => postcode
                            ),
         [1] => Array      (
             [username]    => 1234           
             [name]        => Name    
             [address]     => array  (
                                 [line1]    => address line 1
                                 [line2]    => address line 2
                                 [postcode] => postcode
                            )
)

我希望能够通过地址数组中的一个元素对上述数组进行排序。
我知道array_multisort函数可以很容易地按用户名或地址进行排序,但是无法通过另一个级别下的字段进行排序。
非常感谢任何帮助。
谢谢。

你需要使用 usort(),实际上。 - zerkms
@zerkms,那是不正确的。构建一个排序数组可以在不使用usort的情况下解决它。请参见http://php.net/manual/en/function.array-multisort.php中的#3。 - Teson
usort 大约慢了 10 倍,见下文。 - Teson
@user247245 请证明它。 - zerkms
@zerkms,请查看下面添加的演示。 - Teson
@user247245和他们在类似的时间工作https://3v4l.org/DoQmP。不确定为什么您认为它慢了10倍。但无论如何。 - zerkms
3个回答

4

我刚刚找到了如何实现它...

首先需要将我们想要排序的数据提取到一个单独的数组中,然后再将其发送到array_multisort()函数中。

例如:

 foreach(Array() as $key=>$value) {
     $sort_data[$key] = $value['address']['postcode'];
}

array_multisort($sort_data, SORT_DESC, Array());

根据提供给array_multisort()函数的POSTCODE值和SORT筛选器,初始Array()现在将进行排序。


2

使用这个解决方案,您无需进行额外的准备即可获得结果:

$result = usort($data, function($a, $b) {
    return strcmp($a['address']['postcode'], $b['address']['postcode']);
});
< p > array_multisort 的目的是一次排序多个不同的数组。 如果只有一个原始数组需要排序 - 应该使用 usort()


0

顺便提一下,为了支持字符串和数字排序,usort 的速度会慢大约10倍左右。

$rs[] = array('username'=>'bla bla..','Logins'=>124);
$rs[] ...

usort($rs,function($a,$b) {
  $i = 'Logins';
  if (is_numeric($a[$i])) {
    return $a[$i] > $b[$i];
  } else {
    return strcmp($a[$i],$b[$i]);
  }
});

对比。

$orderBy = 'Logins';
$sort = array();
foreach($rs as $key=>$rec) $sort[$key] = $rec[$orderBy];
array_multisort($sort,SORT_ASC,$rs);

演示

<?php
$rs = array();
$rs[] = array('adam','cederblom',50);
$rs[] = array('denny','bengtsson',9);
$rs[] = array('beata','andersson',30);
$rs[] = array('adam','cederblom',50);
$rs[] = array('denny','bengtsson',9);
$rs[] = array('beata','andersson',30);
$rs[] = array('adam','cederblom',50);
$rs[] = array('denny','bengtsson',9);
$rs[] = array('beata','andersson',30);
$rs[] = array('adam','cederblom',50);
$rs[] = array('denny','bengtsson',9);
$rs[] = array('beata','andersson',30);
$data = array_merge($rs,$rs);

$orderBy = 2; //0 - 2
//please note that usort doesn't use global, so update $i

echo 'Usort: ';
$start = microtime(true);
for($j=0;$j<1000;$j++) {
  //revert to unsorted.
  $rs = $data;
  usort($rs,function($a,$b) {
    $i = 2; //should be same as orderBy..
    if (is_numeric($a[$i])) {
      return $a[$i] > $b[$i];
    } else {
      return strcmp($a[$i],$b[$i]);
    }
  });
}
echo microtime(true) - $start . '<hr/>';
foreach($rs as $rec) {
  echo serialize($rec) . '<hr/>';
}

echo 'Multisort: ';
$start = microtime(true);
for($j=0;$j<1000;$j++) {
  //revert to unsorted.
  $rs = $data;
  $sort = array();
  foreach($rs as $key=>$rec) {
    //demo, numeric index in record
    $sort[$key] = $rec[$orderBy];
  }
  array_multisort($sort,SORT_ASC,$rs);
}
echo microtime(true) - $start . '<hr/>';
foreach($rs as $rec) {
  echo serialize($rec) . '<hr/>';
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接