将 PHP 数组重新排列为嵌套的分层数组


rearrange a php array into a nested hierarchical array

如何使用 php 将数组 #1 转换为数组 #2 结构?

第一个数组是对生物列表的数据库查询结果,每个生物都按其顺序、科、属、种进行分类。等级种是各属的子分类,属分类是各科等的子分类。

在命名空间术语中,您可以像这样阅读:

索引处的项目[ 0] ---> 半翅目.米里达科.卡纳卡米里斯
索引处的项目[ 1] ---> 半翅目.蜥蜴科.新翅目.切口

array#1 的键之间有一种父/子关系

,如下所示:
  • "Rank_Order"值是"Rank_Family"值的父值
  • "Rank_Family"值是"Rank_Genus"值的父值
  • "Rank_Genus"值是"Rank_Species"值的父值

数组#1:

Array
(
    [0] => Array
        (
            ['Rank_Order'] => 'Hemiptera'
            ['Rank_Family'] => 'Miridae'
            ['Rank_Genus'] => 'Kanakamiris'
            ['Rank_Species'] => ''
        )   
    [1] => Array
        (
            ['Rank_Order'] => 'Hemiptera'
            ['Rank_Family'] => 'Miridae'
            ['Rank_Genus'] => 'Neophloeobia'
            ['Rank_Species'] => 'incisa'
        )
    [2] => Array
        (
            ['Rank_Order'] => 'Hemiptera'
            ['Rank_Family'] => 'Noridae'
            ['Rank_Genus'] => 'Canelbia'
            ['Rank_Species'] => 'Arissa'
        )
)

以下数组是我需要的数组结构:数组#2:

Array(
    [name]     => 'Hemiptera'
    [children] => Array(
        [0] => Array(
            [name]     => 'Miridae'
            [children] => Array(
                [0] => Array(
                    [name]     => 'Kanakamiris'
                    [children] => Array(
                    )
                )
                [1] => Array(
                    [name]     => 'Neophloeobia'
                    [children] => Array(
                        [0] => Array(
                            [name] => 'incisa'
                            [children] => Array(
                            )
                        )
                    )
                )
            )
        )
        [1] => Array(
            [name]     => 'Noridae'
            [children] => Array(
                [0] => Array(
                    [name]     => 'Canelbia'
                    [children] => Array(
                        [0] => Array(
                            [name] => 'Arissa'
                            [children] => Array(
                            )
                        )
                    )
                )
            )
        )
    )
)

我在堆栈溢出中看到类似的问题,尽管在我的情况下无法使用它们。 例如.php-reorder-array-to-reflect-parent-id-hierarchy

我认为这对于非常大的数组来说不会非常高效,但它适用于您的场景(这是一个示例)。

 $array = ...
 $levels = array('Rank_Order', 'Rank_Family', 'Rank_Genus', 'Rank_Species');
 function get_children($parent, $lev, $orig, $levels){
     if($lev + 1 > count($levels)){
          return array();
     }
     $seen = array();
     $children = array();
     foreach($orig as $node){
         if($node[$levels[$lev]] == $parent && !in_array($node[$levels[$lev+1]], $seen)){
             $seen[] = $node[$levels[$lev+1]];
             $children[] = get_children($node[$levels[$lev+1]], $lev+1, $orig, $levels);
         }
     }
     return array('name' => $parent, 'children' => $children);
 }
 function hier($orig, $levels){
     $seen = array();
     $result = array();
     foreach($orig as $node){
         if(!in_array($node[$levels[0]], $seen)){
              $seen[] = $node[$levels[0]];
              $result[] = get_children($node[$levels[0]], 0, $orig, $levels);
         }
     }
     return $result;
 }
 print_r($array);
 print_r(hier($array, $levels));