让我们假设我有一个嵌套的PHP数组$aaa,其中条目$aaa[$bbb][$ccc]如下
array(0 => array('x' => 3, 'y' => 2), 1 => array('x' => 2, 'y' => 1), 2 => array('x' => 4, 'y' => 1))假设我只想按x值对这个数组进行排序,以便得到数组
array(0 => array('x' => 2, 'y' => 1), 1 => array('x' => 3, 'y' => 2), 2 => array('x' => 4, 'y' => 1))而不是修改所有其他子数组。我该怎么做呢?我无法用usort和自定义函数来完成这个任务。
发布于 2016-11-10 18:17:57
然而,这可以用usort来完成
$arr = array(
0 => array('x' => 3, 'y' => 2),
1 => array('x' => 2, 'y' => 1),
2 => array('x' => 4, 'y' => 1)
);
function cmp($a, $b)
{
if ($a['x'] == $b['x']) {
return 0;
}
return ($a['x'] < $b['x']) ? -1 : 1;
}
usort($arr, "cmp");
var_dump($arr);结果
array(3) {
[0]=>
array(2) {
["x"]=>
int(2)
["y"]=>
int(1)
}
[1]=>
array(2) {
["x"]=>
int(3)
["y"]=>
int(2)
}
[2]=>
array(2) {
["x"]=>
int(4)
["y"]=>
int(1)
}
}发布于 2016-11-10 19:24:35
usort是一种很容易做到的方法(不清楚为什么您的方法不起作用),如果您使用的是PHP7,这是一个很好的机会来使用新特性之一,<=>,组合比较算子,(AKA,宇宙飞船)。
usort($your_array, function($a, $b) {
return $a['x'] <=> $b['x'];
});宇宙飞船运算符用于比较两个表达式。当$a分别小于、等于或大于$b时,它返回-1、0或1。
(如果您没有使用PHP 7,那么当然您仍然可以使用带有不同比较函数的usort,或者其他方法,如这里的其他答案所示。)
发布于 2016-11-10 18:22:13
您可以像下面这样与usort一起使用:
<?php
function compare_func($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
$name = array(0 => array('x' => 3, 'y' => 2), 1 => array('x' => 2, 'y' => 1), 2 => array('x' => 4, 'y' => 1));
usort($name, compare_func('x'));
print_r($name);
?>输出:Array ( [0] => Array ( [x] => 2 [y] => 1 ) [1] => Array ( [x] => 3 [y] => 2 ) [2] => Array ( [x] => 4 [y] => 1 ) )
有关更多细节,http://php.net/manual/en/function.usort.php
https://stackoverflow.com/questions/40534319
复制相似问题