PHP - 排序第n级子数组
PHP - sort nth-level subarray
假设我有一个嵌套的 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
和自定义函数来完成。
但是可以用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)
}
}
您可以像下面那样与 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 ) )
假设您定义了$bbb
和$ccc
作为键;从数组中提取 x
键并对其进行排序,对原始数组进行排序:
array_multisort(array_column($aaa[$bbb][$ccc], 'x'), $aaa[$bbb][$ccc]);
usort
是一种简单的方法(不清楚为什么你的方法不起作用),如果你使用 PHP 7,这是使用新功能之一的好机会,<=>
,combined comparison operator,(又名宇宙飞船)。
usort($your_array, function($a, $b) {
return $a['x'] <=> $b['x'];
});
The spaceship operator is used for comparing two expressions. It returns -1, 0 or 1 when $a is respectively less than, equal to, or greater than $b.
(如果您不使用 PHP 7,那么您当然仍然可以使用具有不同比较功能的 usort
或其他方法,如此处的其他答案所示。)
假设我有一个嵌套的 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
和自定义函数来完成。
但是可以用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)
}
}
您可以像下面那样与 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 ) )
假设您定义了$bbb
和$ccc
作为键;从数组中提取 x
键并对其进行排序,对原始数组进行排序:
array_multisort(array_column($aaa[$bbb][$ccc], 'x'), $aaa[$bbb][$ccc]);
usort
是一种简单的方法(不清楚为什么你的方法不起作用),如果你使用 PHP 7,这是使用新功能之一的好机会,<=>
,combined comparison operator,(又名宇宙飞船)。
usort($your_array, function($a, $b) {
return $a['x'] <=> $b['x'];
});
The spaceship operator is used for comparing two expressions. It returns -1, 0 or 1 when $a is respectively less than, equal to, or greater than $b.
(如果您不使用 PHP 7,那么您当然仍然可以使用具有不同比较功能的 usort
或其他方法,如此处的其他答案所示。)