2012-03-10 9 views
5

配列を再構成したいのですが、stuckoverflowのソリューションの中には、第1レベルの項目に対して「適切」にするのに役立つものもありますが、配列がnレベル深いことに気づくでしょう。親子関係の再構造化nレベル配列(PHP)

方法restructure()は再帰的に使用されません。それはおそらく間違っていると、それを正しくする方法が分かりません。

子供キーは、それぞれのidの持つ子ども、親キーリンク親IDにアイテムがあると言います。

class FilterMenu { 

    protected $tree = array(); 

    static protected $structure = array(); 

    public function __construct(array $tree) 
    { 
     $this->tree = $tree; 
    } 

    public function getStructure() 
    { 
     self::restructure($this->tree); 
     return self::$structure; 
    } 

    static public function restructure(array $structure) 
    { 
     foreach ($structure as $k => $v) 
     { 
      if (isset($v['parent']) and isset($v['children']) and count($v['children']) == 1) 
      { 
       // only 1 child 
       self::$structure[$k] = current(array_keys($v['children'])); 
      } 
      elseif (isset($v['children'])) 
      { 
       $keys = array_keys($v['children']); 
       self::$structure[$k] = array_combine($keys, $keys); // mirror array 

       //self::restructure($v['children']); 
      } 
      else 
      { 
       // no children 
       self::$structure[$k] = $k; 
      } 
     } 
    } 
} 



// test array 

$tree = array(
    1 => array(
     'parent' => 1 
    ), 
    2 => array(
     'parent' => 2, 
     'children' => array(
      3 => array(
       'parent' => 2 
      ), 
      6 => array(
       'parent' => 2, 
       'children' => array(
        10 => array(
         'parent' => 6, 
         'children' => array(
          4 => array(
           'parent' => 10 
          ) 
         ) 
        ) 
       ), 
      ), 
     ), 
    ), 
    7 => array(
     'parent' => 7, 
     'children' => array(
      11 => array(
       'parent' => 7 
      ) 
     ) 
    ), 
    14 => array(
     'parent' => 14, 
     'children' => array(
      15 => array(
       'parent' => 14, 
      ), 
      16 => array(
       'parent' => 14, 
      ), 
      19 => array(
       'parent' => 14, 
      ), 
      20 => array(
       'parent' => 14, 
      ), 
      21 => array(
       'parent' => 14, 
      ), 
     ) 
    ) 
); 

// test: 
$tree = new FilterMenu($tree); 
echo '<pre>'.print_r($tree->getStructure(), true); 

実際の結果:

Array 
(
    [1] => 1 
    [2] => Array 
     (
      [3] => 3 
      [6] => 6 
     ) 

    [7] => 11 
    [14] => Array 
     (
      [15] => 15 
      [16] => 16 
      [19] => 19 
      [20] => 20 
      [21] => 21 
     ) 

) 

所望/期待される結果である:ここ

Array 
(
    [1] => 1 
    [2] => Array 
     (
      [3] => 3 
      [6] => Array 
       (
        [10] => 4 // <-- array with n-levels... 
       ) 

     ) 

    [7] => 11 
    [14] => Array 
     (
      [15] => 15 
      [16] => 16 
      [19] => 19 
      [20] => 20 
      [21] => 21 
     ) 

) 

クラスとアレイをテストlink to codepadあります。

ご協力いただきまして誠にありがとうございます。ありがとう。

答えて

2

私はあなたがこのために探していると思う:

function collapse(&$array) { 
    foreach ($array as $k => &$v) { 
    if (array_key_exists('children', $v)) { 
     collapse($v['children']); 
     $array[$k] = $v['children']; 
    } else { 
     $array[$k] = $k; 
    } 
    } 
} 

、このように呼ばれるときに、:

collapse($tree); 
print_r($tree); 

は生成します。

Array (
    [1] => 1 
    [2] => Array (
      [3] => 3 
      [6] => Array (
        [10] => Array (
           [4] => 4 
          ) 
        ) 
     ) 
    [7] => Array (
      [11] => 11 
     ) 
    [14] => Array (
      [15] => 15 
      [16] => 16 
      [19] => 19 
      [20] => 20 
      [21] => 21 
     ) 
) 

はあなたにhttp://codepad.org/8atfSWGC

+0

賞賛を参照してください。 @トマラク!あなたのソリューションは、私が最終的な出力に必要なものを正確に行います。この例のクラスは取り除いたバージョンですが、「崩壊」ソリューションは完璧にフィット...どのようにそれを把握する必要があり、上verb8 @なぜ:) – verb8

+0

は正しいことをして、あなたの期待構造が間違っています。このソリューションは元の配列を変更することに注意してください。あなたがそれを望まないなら、あなたはその機能を適応させなければなりません。 – Tomalak

+0

クラスメソッドhttp://codepad.org/O3JV5rQeとしてぶら下がっている機能です。乾杯してください。 – verb8