【问题标题】:Re-arrange array elements if they meet a condition如果满足条件,则重新排列数组元素
【发布时间】:2011-08-19 22:17:59
【问题描述】:

数组:

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

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

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

)

如何将所有具有“父”值!= 0 的元素移动到键与父值相同的元素之后?

比如上面420键的元素需要跟在354键的元素后面……

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

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

    但这是另一个例子:

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

    因此,您希望所有三行 100101102 都直接位于 10 行之后,这是不可能的。

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

    [更新]

    所以还有这些问题:

    • 您是否只需要对节点进行排序,以便在将每个节点用作父节点之前在某处定义它?
    • 直接子节点是否必须直接跟随其父节点,或者中间是否有其他节点?
    • 父 ID 是否总是小于节点 ID?

    【讨论】:

    • hm.. 你为什么说这是不可能的?我只想重新排列数组...父值将始终指向现有元素键..
    • 好吧,要么我不明白你的问题,要么你的例子太简单了。你希望我的例子如何安排?可能的解决方案不止一种,我不确定您想要哪一种。
    • 嗯,这就是我想要的:) 所有三个元素的键 100、101、102 都在键 10 之后。是的,1000 和 1001 在 100 之后 :) 我不知道如果像有人发布的那样使用 uasort 是可能的,那么看起来你需要递归或其他东西......
    • 如果parent id 总是小于数组键,您可以简单地分两步对数组进行排序:首先按数组键(数字),然后按父 ID(也按数字) .此外,我只是注意到我的例子也太简单了。有关详细信息,请参阅我的“答案”。
    【解决方案2】:

    也许您正在寻找一种使平面数组具有某种层次结构的方法?

    这是一个非常简单的例子,假设你的孩子总是比他们的父母拥有更高的 id。

    <?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

    【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多