Php 如果数组元素满足条件,请重新排列它们

Php 如果数组元素满足条件,请重新排列它们,php,arrays,sorting,Php,Arrays,Sorting,阵列: array( '354' => array( 'parent' => 0 ), '370' => array( 'parent' => 0 ), '420' => array( 'parent' => 354 ), ) 如何移动具有“父级”值的所有元素!=0,就在键与父值相同的元素之后

阵列:

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

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

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

)
如何移动具有“父级”值的所有元素!=0,就在键与父值相同的元素之后


例如,上面带有420个键的元素需要跟随带有354键的元素…

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

但这里还有另一个例子:

Number | Parent
10     | 1
11     | 1
100    | 10
101    | 10
102    | 10
1000   | 100
1001   | 100
因此,您希望所有三行
100
101
102
都直接位于行
10
之后,这是不可能的

在行
100
101
之间,您可能需要行
1000
1001
,因为它们的父行是
100

[更新]

因此,仍然存在以下问题:

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

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

      但这里还有另一个例子:

      Number | Parent
      10     | 1
      11     | 1
      100    | 10
      101    | 10
      102    | 10
      1000   | 100
      1001   | 100
      
      因此,您希望所有三行
      100
      101
      102
      都直接位于行
      10
      之后,这是不可能的

      在行
      100
      101
      之间,您可能需要行
      1000
      1001
      ,因为它们的父行是
      100

      [更新]

      因此,仍然存在以下问题:

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

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

      这是一个非常简单的案例,它可以让你的孩子比他们的父母拥有更高的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>');
      

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

      这是一个非常简单的案例,它可以让你的孩子比他们的父母拥有更高的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>');
      

      hm。。你为什么说这是不可能的?我只是想重新安排阵列。。。父值将始终指向现有的元素键。好吧,要么我不理解您的问题,要么您的示例太简单。您希望如何安排我的示例?有不止一个可能的解决方案,我不确定你想要哪一个。这就是我想要的:)所有三个元素都有键100、101、102,以跟随键10的元素。是的,1000和1001在100之后:)我不知道是否可以像某人发布的那样使用uasort,看起来你需要递归或其他什么…如果父id总是小于数组键,你可以简单地分两步对数组进行排序:首先按数组键(数字)排序,然后按父id(也按数字)排序。此外,我只是注意到我的例子也太简单了。详情见我的“答案”。嗯。。你为什么说这是不可能的?我只是想重新安排阵列。。。父值将始终指向现有的元素键。好吧,要么我不理解您的问题,要么您的示例太简单。您希望如何安排我的示例?有不止一个可能的解决方案,我不确定你想要哪一个。这就是我想要的:)所有三个元素都有键100、101、102,以跟随键10的元素。是的,1000和1001在100之后:)我不知道是否可以像某人发布的那样使用uasort,看起来你需要递归或其他什么…如果父id总是小于数组键,你可以简单地分两步对数组进行排序:首先按数组键(数字)排序,然后按父id(也按数字)排序。此外,我只是注意到我的例子也太简单了。请参阅我的“答案”了解详细信息。但是它们的数组应该保持平坦,然后可能您正在寻找类似这样的内容:php中的自定义排序,尽管您的函数希望保持平坦,但是它们的数组应该保持平坦,然后可能您正在寻找类似这样的内容:php中的自定义排序,尽管您的函数希望