2011-07-25 3 views
5

ソートされたマルチレベルの親 - >子配列を作成する際に非常に役立つstackoverflow threadを使用しました。今はそのソートされた配列を取りたい複数レベルの親 - >子配列を使用して1つのSELECTを作成する

Array 
( 
    [1] => Array 
     ( 
      [name] => User Manual 
      [parentId] => 0 
      [children] => Array 
       ( 
        [2] => Array 
         ( 
          [name] => Users 
          [parentId] => 1 
          [children] => Array 
           ( 
            [4] => Array 
             ( 
              [name] => Privileges 
              [parentId] => 2 
             ) 
           ) 
         ) 
        [3] => Array 
         ( 
          [name] => Reference 
          [parentId] => 1 
          [children] => Array 
           ( 
            [5] => Array 
             ( 
              [name] => Glossary 
              [parentId] => 3 
             ) 
            [6] => Array 
             ( 
              [name] => Index 
              [parentId] => 3 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

以下上述したスレッドのソート方法に基づいて、サンプルマルチレベル(3つのレベル)pa​​rent->子ソートされた配列であります上で見たように

<option value='1'>User Manual</option> 
<option value='2'>User Manual -> Users</option> 
<option value='4'>User Manual -> Users -> Privileges</option> 
<option value='3'>User Manual -> Reference</option> 
<option value='5'>User Manual -> Reference -> Glossary</option> 
<option value='6'>User Manual -> Reference -> Index</option> 

目標マルチレベルの親/子を表す表示文字列をコンパイルすることである。そして、例えば以下のようparent->子構造を表示して表す単一 HTML SELECTを生成しますパス各項目ごとに各オプションのVALUEは、表示されたコンパイル済み文字列の最後の項目です。そのため、OPTION 'User Manual - > Users - > Privileges'では、VALUEは特権のIDですが、表示テキストはその配列の親子関係を表しています。

私は常に以下のようなオプションのリストを表示し終わる作成]を選択します:

<option value='1'>User Manual</option> 
<option value='2'>User Manual -> Users</option> 
<option value='4'>Users -> Privileges</option> 
<option value='3'>User Manual -> Reference</option> 
<option value='5'>Reference -> Glossary</option> 
<option value='6'>Reference -> Index</option> 

あなたは唯一の親/子関係の1つのレベルを追跡することが可能であることがわかります。私は複数のレベルがある場合、以前のX parent.nameを追跡中にトラブルを抱えている

function buildOptions($arr, $target, $parent = NULL) { 
    $html = ""; 
    foreach ($arr as $key => $v) 
    { 
    if (array_key_exists('children', $v)) 
    { 
     if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
     else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

     $html .= buildOptions($v['children'],$target,$v['name']." > "); 
    } 
    else if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
    else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

    } 

    return $html; 
} 

を次のように選択するオプションリストを作成するために、配列を処理

私の関数です。ここの援助は歓迎されるでしょう。ありがとうございました!

+2

あなたの配列はどのようなものが見えますか?再帰のような匂いがかかっているかもしれません。 –

+0

あなたの権利は、再帰を使って2つのレベルを表示するので、問題は2つのレベルを超えてツリー構造の履歴を保持しています。問題は再帰があらかじめソートされた配列を通して機能することです。それは各子供を扱い、それが自然に進行するにつれて子供です。だから、それが前の子供に戻るとき、私は弦を戻すことを概念化することに苦労している。うまくいけばそれは理にかなっている。私はポストを配列の例で更新します。 – Brad

+0

@ブラッド:スニペットに再帰呼び出しはありません。 'toUL'って何? '$ target'とは何ですか?階層を表現するための完全なパスを繰り返す代わりに、視覚的な手掛かり(インデント)を使用することを検討しますか? –

答えて

3

はあなたの再帰呼び出しをこのように修正し、あなたは、各ノード上の完全な階層を取得する必要があります:

function buildOptions($arr, $target, $parent = NULL) { 
    $html = ""; 
    foreach ($arr as $key => $v) 
    { 
    if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
    else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

    if (array_key_exists('children', $v)) 
     $html .= buildOptions($v['children'],$target,$parent . $v['name']." > "); 
    } 

    return $html; 
} 
+0

ありがとう!私はそれが近いとは信じられません。私はそれを試みたと私は誓うことができます。あまりにも多くの時間が私が思う同じ問題を見つめている。 – Brad

+0

私は自分の答えをフォローアップとして投稿することはできませんが、(!$ parent)が$ v ['name']を出力するかどうかを確認するようにあなたの応答を少し変更しました。 $ v ['name']。" - >" – Brad

+1

ちょうど注記:もし私が問題であまりにも多くの時間を見つめると、私はただ立ち上がって離れます。 1-2時間後、私は通常10分以内に問題を解決します。これは私のために働いた。 :) –

関連する問題