PHP - 排序第n级子阵列

时间:2016-11-10 18:09:58

标签: php arrays sorting nested sub-array

让我们假设我有一个嵌套的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和自定义函数执行此操作。

4 个答案:

答案 0 :(得分:3)

然而可以完成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)
  }
}

答案 1 :(得分:1)

usort 是一种简单的方法(不清楚为什么你的工作没有用),如果你正在使用PHP 7,那么&#39 ;这是一个很好的机会,可以使用其中一项新功能<=>combined comparison operator,(太空飞船)。

usort($your_array, function($a, $b) {
    return $a['x'] <=> $b['x'];
});
  

太空船运营商用于比较两个表达式。当$ a分别小于,等于或大于$ b时,它返回-1,0或1。

(如果你没有使用PHP 7,那么你当然可以使用usort使用不同的比较功能或其他方法,正如这里的其他答案所示。)

答案 2 :(得分:0)

您可以使用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

答案 3 :(得分:0)

假设您已将$bbb$ccc定义为关键字;从数组中提取x个键并对其进行排序,对原始数组进行排序:

array_multisort(array_column($aaa[$bbb][$ccc], 'x'), $aaa[$bbb][$ccc]);