【问题标题】:rearrange a php array into a nested hierarchical array将 php 数组重新排列为嵌套的分层数组
【发布时间】:2012-08-12 10:44:48
【问题描述】:

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

第一个数组是对生物体列表的数据库查询结果,每个生物体都按其目、科、属、种进行分类。 Hierarchically Species 是各种 Genus 的子分类,Genus 分类是各种 Families 的子分类等。

在命名空间方面,你可以这样解读:

索引项[0] ---> Hemiptera.Miridae.Kanakamiris
索引项[1] ---> Hemiptera.Miridae.Neophloeobia.incisa

array#1的key之间有一种父子关系,如下:

  • “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

【问题讨论】:

  • 改变的动机是什么,为什么不使用 OOP?
  • 您说类似的问题不适用于您的情况,但没有向我们提供有关您的特定数组结构的任何详细信息... 您是什么问题??
  • 我想获取第一个数组并从中创建第二个数组。我将两个代码块之间的语句编辑为一个问题,道歉
  • 这样做的动机是第二个数组是我在将数组编码为 JSON 并将其用于其他目的之前需要的结构
  • 不清楚第一个数组如何转换为第二个数组,因为键名不同。还有,为什么不直接转成json呢,为什么还要经过嵌套数组的另一个阶段呢?

标签: php arrays hierarchy taxonomy


【解决方案1】:

我认为这对于非常大的数组来说不是超级高效,但它适用于您的场景 (here's a sample)。

 $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));

【讨论】:

  • 看来$result 需要被推到某个地方。我试图了解在哪里
  • @johowie:啊,我错过了第二个函数中的初始化,但实际上并不是必需的。您只需要捕获对 hier 的调用的输出
  • 确实可以按要求工作,尽管计算时间似乎是个问题。
  • @johowie,我不清楚是否可以做得更好。对于深度 M 和 N 个不同的根元素,这将花费最多 O(MN) 时间,并且对于完整的层次结构应该做得更好。这里,M 是常数,所以不管你信不信,算法的复杂度是线性的。
  • hier() 中似乎return $seen; 应该是return $result;,对吗?当我运行这个 php 脚本时,它在我的本地主机 (MAMP) 上需要很长时间,并且数组大于少数节点时,它只会因服务器错误而超时。您在 ideone.com 上的 @Mark 示例运行速度要快得多。我不知道为什么我的本地主机不喜欢这个!
猜你喜欢
  • 2021-05-03
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2017-11-17
相关资源
最近更新 更多