如果满足条件,则重新排列数组元素

时间:2011-08-19 22:18:00

标签: php arrays sorting

数组:

array(
  '354' => array( 
             'parent' => 0
           ),

  '370' => array( 
             'parent' => 0
           ),

  '420' => array( 
             'parent' => 354
           ),

)

如何移动所有具有'parent'值的元素!= 0,就在该键与该父值相同的元素之后?

例如,上面有420个键的元素需要使用354键...

2 个答案:

答案 0 :(得分:1)

在一般情况下,这是不可能的。在你的例子中它会起作用。

但这是另一个例子:

Number | Parent
10     | 1
11     | 1
100    | 10
101    | 10
102    | 10
1000   | 100
1001   | 100

所以你希望所有三行100101102直接来到行10之后,这是不可能的。

在行100101之间,您可能需要行10001001,因为他们的父级是100

<强> [更新]

所以仍有这些问题:

  • 您是否只需要订购节点,以便在将每个节点用作父节点之前将其定义在某个地方?
  • 直接孩子是否必须直接跟随他们的父母,或者中间可能还有其他节点吗?
  • 父ID是否始终小于节点ID?

答案 1 :(得分:0)

也许你正在寻找一种让平面阵列有某种层次结构的方法?

这是一个非常简单的案例,可以做到这一点,因为你的孩子总是拥有比父母更高的身份。

<?php
$array = array(
  '354' => array( 
             'parent' => 0
           ),
  '370' => array( 
             'parent' => 0
           ),
  '420' => array( 
             'parent' => 354
           ),
  '550' => array(
             'parent' => 420
           ),
);


/**
 * 
 * This function will convert a flat array with elements to the proper hierarchy structure
 * @param array $array
 */
function hierarchy(&$array) {
    arsort($array);
    foreach($array as $key => $value)
    {
        if($value['parent'])
        {
            $array[$value['parent']]['children'][$key] = $value;
            unset($array[$key]);
        }
    }
    asort($array);
    return $array;
}

(print '<pre>' . print_r(hierarchy($array), true) . '</pre>');

下载一个测试用例:

http://codepad.org/RT51uOfn