在php

时间:2015-12-11 10:33:46

标签: php arrays sorting

我想基于子值对数组进行排序,我希望父子数组在第一个位置然后是其子项,然后是它的子项等等.​​.....基于它的“父”值 这是我的示例数组,

$array= Array( 
            Array("self"=>"user4", "parent"=>"user6"),
            Array("self"=>"user2", "parent"=>"user1"),
            Array("self"=>"user1", "parent"=>"user4"),
            Array("self"=>"user5", "parent"=>"user2"),
            Array("self"=>"user6", "parent"=>"user3"),
            Array("self"=>"user3", "parent"=>"Parent") // it will be anything
        );

此数组应按如下方式排序

Array(
[0] => Array
    (
        [self] => user3
        [parent] => Parent
    )

[1] => Array
    (
        [self] => user6
        [parent] => user3
    )

[2] => Array
    (
        [self] => user4
        [parent] => user6
    )

[3] => Array
    (
        [self] => user1
        [parent] => user4
    )

[4] => Array
    (
        [self] => user2
        [parent] => user1
    )

[5] => Array
    (
        [self] => user5
        [parent] => user2
    ))

3 个答案:

答案 0 :(得分:3)

您可以通过以下方式使用它:

$array= Array( 
            Array("self"=>"user4", "parent"=>"user6"),
            Array("self"=>"user2", "parent"=>"user1"),
            Array("self"=>"user1", "parent"=>"user4"),
            Array("self"=>"user5", "parent"=>"user2"),
            Array("self"=>"user6", "parent"=>"user3"),
            Array("self"=>"user3", "parent"=>"Parent") // it will be anything
        );
$result = "";
foreach($array as $val)
{
    if($val['parent']== 'Parent')
    {
        $result[] = $val;
        getNextNode($val['self']);
    }
}
function getNextNode($child)
{
    global $array;
    global $result;
    foreach($array as $val)
    {
        if($val['parent'] == $child)
        {
            $result[] = $val;
            getNextNode($val['self']);
        }
    }
}
echo "<pre/>";
print_r($result);

你得到了理想的结果。

答案 1 :(得分:2)

请看一下Topological Sorting。它对你有用

答案 2 :(得分:2)

通常当您需要以非平凡的方式在PHP中对某些内容进行排序时,您应该使用用户定义的排序函数(http://php.net/manual/es/function.usort.php),就像这一样。请注意,如果要保留数组索引,则应使用 uasort 函数而不是 usort 函数。这将使您的代码保持简洁。

function cmp($a, $b) {
    if($a['parent'] == 'Parent' || $a['self'] == $b['parent'])
        return -1;
    if($b['parent'] == 'Parent' || $b['self'] == $a['parent'])
        return 1;
    return 0;
}

$array= Array( 
        Array("self"=>"user4", "parent"=>"user6"),
        Array("self"=>"user2", "parent"=>"user1"),
        Array("self"=>"user1", "parent"=>"user4"),
        Array("self"=>"user5", "parent"=>"user2"),
        Array("self"=>"user6", "parent"=>"user3"),
        Array("self"=>"user3", "parent"=>"Parent") // it will be anything
    );

usort($array, 'cmp');
print_r($array);

此处,没有父级的user被定义为“父级”为parent,但它可能类似false,在这种情况下您只需要更新cmp相应地发挥作用。

对不起格式化,电话真的很难。请随时编辑它。