2016-03-25 6 views
0

私は以下のような配列を持っているとします。配列の2番目の値はレベル/深さです。視覚的に表現するために行の値で配列をネストする

$arr = array(
    ['product 1', 0], 
    ['product 2', 1], 
    ['product 3', 1], 
    ['product 4', 2], 
    ['product 5', 0] 
); 

:無制限のレベルを持つ

Array 
(
    [0] => Array 
     (
      [0] => product 1 
      [1] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [0] => product 2 
          [1] => 1 
         ) 

        [1] => Array 
         (
          [0] => product 3 
          [1] => 1 
          [children] => Array 
           (
            [0] => product 4 
            [1] => 2 
           ) 
         ) 
       ) 
     ) 
    [1] => Array 
     (
      [0] => product 5 
      [1] => 0 
     ) 

) 

product 1 
    product 2 
    product 3 
     product 4 
product 5 

私はこれに変換しようとしています。

私はほぼ一日中この壁に頭をぶつけていましたが、解決には至りませんでした。自分自身で物事を解決することができないようにイライラするので、私は敗北を認めなければなりません。私は表示する有用なコードがありません。私はこれが基本的にコードを求めていることを知っていますが、これは私の脳の力を超えています。 誰かが少し挑戦しているなら、これはそうかもしれない:)。私はとても感謝しています。

ありがとうございます。

+0

私は理解していないだけの事はある: 'アレイ ( [0] => product 5 [1] => 1 ) 'なぜ2番目の要素1の値はここにありますか?打ち間違え?とにかくそれは何を表しますか?深度? – Rizier123

+0

これは、データベースまたはそのランダムなレコードですか?あなたは各レコードのIDを持っていますか? – Veniamin

+1

初期配列が '$ arr = array(['product 5'、0]、 ['product 2'、2]、 ['product 4'、1]、 ['product 3' 2]、 ['product 1'、0]); '?そのような場合にどのように期待される "変換"の出力を見なければならないでしょうか? – RomanPerekhrest

答えて

1

私はあなたの要件を満たすためにもう1つのレベルで最初の配列を拡張しました - "無限レベルで"。
そして、ここでは、私がfindParentと呼ばれる再帰関数を持つソリューションです:

$arr = array(
    ['product 1', 0], 
    ['product 2', 1], 
    ['product 3', 1], 
    ['product 4', 2], 
    ['product 5', 3], 
    ['product 6', 3], 
    ['product 7', 0], 
    ['product 8', 1], 
); 

$structure = []; 
foreach ($arr as $k => $v) { 
    if (empty($structure) || $v[1] == 0) { 
     $structure[] = $v; 
    } else { 
     $last = array_pop($structure); 
     $current_key = $k; 
     $parent_key = ""; 

     while (--$current_key) { 
      if ($v[1] > $arr[$current_key][1]) { 
       $parent_key = $arr[$current_key][0]; 
       break; 
      } 
     } 

     if ($v[1] == 1) { 
      (isset($last['children']))? $last['children'][] = $v : $last['children'] = [$v]; 
     } else { 
      findParent($last['children'], $parent_key, $v); 
     } 
     array_push($structure, $last); 
    } 
} 

function findParent(&$el = [], $parent_key = "", $child = []){ 
    foreach ($el as &$v) { 
     if ($v[0] == $parent_key) { 
      (isset($v['children']))? $v['children'][] = $child : $v['children'] = [$child]; 
      break; 
     } elseif (isset($v['children'])) { 
      findParent($v['children'], $parent_key, $child); 
     } 
    }  
} 

print_r($structure); 

出力:

Array 
(
    [0] => Array 
     (
      [0] => product 1 
      [1] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [0] => product 2 
          [1] => 1 
         ) 

        [1] => Array 
         (
          [0] => product 3 
          [1] => 1 
          [children] => Array 
           (
            [0] => Array 
             (
              [0] => product 4 
              [1] => 2 
              [children] => Array 
               (
                [0] => Array 
                 (
                  [0] => product 5 
                  [1] => 3 
                 ) 

                [1] => Array 
                 (
                  [0] => product 6 
                  [1] => 3 
                 ) 
               ) 
             ) 
           ) 
         ) 
       ) 
     ) 

    [1] => Array 
     (
      [0] => product 7 
      [1] => 0 
      [children] => Array 
       (
        [0] => Array 
         (
          [0] => product 8 
          [1] => 1 
         ) 
       ) 
     ) 
) 
+0

ねえ、あなたの努力に感謝します!しかし、大きな問題が1つあります。この配列に入れてみます:$ arr = array( [product 1、0]、 ['product 2'、1]、 ['product 3'、1]、 ['product 4'、2 ]、 '012' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '; 'product 5'と 'product 6'は 'product 2'や 'product 3'のような兄弟でなければなりません。 – Ivannnnn

+0

@Ivannnnn、私はそれを「大きな問題」と呼んでいません。私の更新を参照 – RomanPerekhrest

+0

素晴らしい!ありがとうローマ、私のお尻を救った。それはまさに私が約12時間ほど達成しようとしていたものであり、笑えませんでした。好奇心の中で、このようなことを書くのにどれくらいの時間がかかりますか? – Ivannnnn

0

私は(あなたがIDを持っている場合)入力のより良い構造はなると思う:

$arr = array(
    ['id' => 1, 'name' => 'product 1', 'cid' => 0, 'level' => 0], 
    ['id' => 2, 'name' => 'product 2', 'cid' => 1, 'level' => 1], 
    ['id' => 3, 'name' => 'product 3', 'cid' => 2, 'level' => 2], 
    ['id' => 4, 'name' => 'product 4', 'cid' => 3, 'level' => 3], 
    ['id' => 5, 'name' => 'product 5', 'cid' => 0, 'level' => 0] 
); 

CID - 出力ツリーの親項目のID

$tree = []; 
foreach($arr as $item){ 
    $tree[ $item['level'] ][ $item['cid'] ][] = $item; 
} unset($item); 

再帰関数

function echoTree($tree, $level = 0, $parent = 0, $prefix = ''){ 
    $level = intval($level); 
    $parent= intval($parent); 

    if(isset($tree[ $level ][ $parent ])){ 
     foreach($tree[ $level ][ $parent ] as $item){ 
      echo "{$prefix}{$item['name']}"; 
      echoTree($tree, $level + 1, $item['id'], $prefix.'---'); 
     } 
    } 
} 

試してみましたが、試していませんでした

+0

いいえ、それは私が探しているとは思わない。明日は新鮮な気分でもっと近く見ることができます。最初に親IDを導入すると、もっと簡単になるかもしれません。私はBTWをdownvoteしませんでした。 – Ivannnnn

関連する問題