无法找到正确的函数来对多维数组进行排序,如下所示:
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函数很容易按用户名或地址排序,但只是无法弄清楚如何使用另一个级别的字段进行排序。
非常感谢任何帮助
由于
答案 0 :(得分:3)
想象一下如何实现它......
首先需要在将数据发送到array_multisort()函数之前将我们想要排序的数据提取到一个单独的数组中
示例:
foreach(Array() as $key=>$value) {
$sort_data[$key] = $value['address']['postcode'];
}
array_multisort($sort_data, SORT_DESC, Array());
现在将根据邮政编码值以及为array_multisort()函数提供的任何SORT过滤器对初始Array()进行排序。
答案 1 :(得分:2)
使用此解决方案,您无需进行其他准备工作即可获得结果:
$result = usort($data, function($a, $b) {
return strcmp($a['address']['postcode'], $b['address']['postcode']);
});
array_multisort
目的是一次对多个不同的数组进行排序。如果只有一个原始数组要进行排序,则应使用usort()
。
答案 2 :(得分: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]);
}
});
VS。
$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/>';
}
&#13;