1

php を使用して array#1 を array#2 構造に変換するにはどうすればよいですか?

最初の配列は、生物のリストに対するデータベース クエリの結果です。各生物は、目、科、属、種で分類されます。階層的には、種はさまざまな属の子分類であり、属分類はさまざまな科などの子分類です。

名前空間に関しては、次のように読むことができます。

インデックス[0]のアイテム ---> 半翅目.ミリダエ.カナカミリス
インデックス[1]のアイテム ---> 半翅目.ミリダエ.Neophloeobia.incisa

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'
        )
)

次の配列は、必要な配列構造です: array#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

4

1 に答える 1

2

これは、非常に大きな配列では非常に効率的ではないと思いますが、シナリオでは機能します (ここにサンプルがあります)。

 $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));
于 2012-08-16T23:21:18.777 に答える