我想基于子值对数组进行排序,我希望父子数组在第一个位置然后是其子项,然后是它的子项等等......基于它的“父”值 这是我的示例数组,
$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
))
答案 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
相应地发挥作用。
对不起格式化,电话真的很难。请随时编辑它。