排序多个级别的多维数组

时间:2015-05-14 16:16:01

标签: php sorting multidimensional-array

我已经检查了有关排序多维数组的其他问题,但在我的情况下它们都没有 我的数组如下所示,我希望基于id值按降序排序

$arr = array(
49 => array(
    'id' => 65,
    'name' => 'any',
    'users' => array(
        772 => array(
            'id' => 149,
            'name' => 'any1'
        ),
        771 => array(
            'id' => 779,
            'name' => 'any2'
        ),
        45 => array(
            'id' => 259,
            'name' => 'any3'
        )   
    )
),
789 => array(
    'id' => 892,
    'name' => 'any4',
    'users' => array(
        65 => array(
            'id' => 389,
            'name' => 'any5' 
        ),
        98 => array(
            'id' => 895,
            'name' => 'any6'
            ),
        99 => array(
            'id' => 899,
            'name' => 'any7'
        )

    )
)

);

我尝试使用usort函数进行排序

usort($arr, function($a, $b) {
return $b['id'] - $a['id'];

});

但我的要求是对父类和子数组进行排序,但这只是父类

2 个答案:

答案 0 :(得分:1)

由于父母和孩子的排序规则相同,我只是定义了一个比较函数。您只需要遍历每个父项并对子项进行排序。

//compare function, sorts by id in desc order
function cmp($a, $b){
    return $b['id'] - $a['id'];
}

//loop over each parent by reference so it changes the value in the parent array    
foreach($arr as &$parent){
    //sort the children
    uasort($parent['users'], 'cmp');
}
//unset the parent array so we don't overwrite the last parent later
unset($parent);

//sort the parents
uasort($arr, 'cmp');

演示:http://codepad.viper-7.com/hqM122

编辑:添加了保留密钥的要求。刚刚转到了uasort。

答案 1 :(得分:0)

试试这个:

function myCallback($left,$right)
{
    return $right['id'] - $left['id'];
}

function id_sort(&$array)
{
    if (!is_array($array))
        return;
    foreach ($array as &$elem)
        if (array_key_exists('users',$elem))
            id_sort($elem['users']);
    uasort($array,'myCallback');
}

id_sort($arr);

这会按父母的ID降序排序,父母的子女按递减顺序排序。