2011-12-15 25 views
1

この場合に必要なロジックは単純かどうかは分かりませんが、わかりませんでした。それで、私は助けを求めています。PHP配列反復ロジックの問題

Array=> 
    [0]=> 
     ['name'] = item1 
     ['id'] = 1 
     ['parent_id'] = 0 
    [1]=> 
     ['name'] = item2 
     ['id'] = 2 
     ['parent_id'] = 1 
    [2]=> 
     ['name'] = item3 
     ['id'] = 3 
     ['parent_id'] = 5 

は今、私はそれぞれ、このリスト内のすべての項目のパスを行う必要があります。

は、クエリの後、私は少しこのようになります配列を取得します。パスは次のようになります。(アイテム2の場合)/item1となります。

注:項目は必ずしも順序通りではありません。親アイテムは子供の後に来るかもしれません...

基本的には、アイテムに出会う​​と、スラッシュの前に項目名が書き込まれるループ(おそらく1以上)が必要です。次に、parent_idを見て、スラッシュの前にparent_idの名前を書き留めます。

次に、親のparent_idを見て、その名前の前にスラッシュを書き留めます。それはparent_idが0に達するまでこれを続けます。その時点で、配列に値を割り当てます。したがって、paths['item2'] = "/item1/item2"のようなものが次のIDに移動し、繰り返されます!

お世話になりました、ありがとうございました!

編集:item3のIDを修正しました。すべてのアイテムは異なるIDを持つように修正されました。 私は疑問を改善するように頼まれた: 最終出力配列は、ビットのようになります。

Array=> 
    ["item1"]="/item1" 
    ["item2"]="/item1/item2" 
    ["item3"]="/item5/item3"  

最終出力はオプションとして、各項目を含むHTML選択フォームだろう、と私はそれがだ持っている必要があります隠れたフィールドか、Ajaxや何かを経由して、何らかの形で関連付けられたパス。

編集:問題を修正しました。私はちょうど、誰かがこれを突き抜けた場合に備えて、ここで解決策を書き出すと思っていました。 注:まだ、それがどのように動作するのかは正確には分かりませんが、動作します!それは非効率的かもしれない、私は知らない。

function getCollPath($proj_list, $length){ 
$total_path = ""; 
$paths = array(); 
for ($j = 0; $j < $length + 1; $j++){ 
    if (isset($proj_list[$j])){ 
     $id = $j; 
     $name = $proj_list[$j]['name']; 
     $total_path = getItemPath($proj_list, $id, NULL); 
     $paths[$name] = $total_path; 
    } 
} 
return $paths; 
}  

function getItemPath($proj_list, $current_id, $path){ 

$current_parent_id = $proj_list[$current_id]['parent_id']; 
$current_name = $proj_list[$current_id]['name']; 
$current_path = "/".$current_name; 
if ($current_parent_id == 0){ 
     if (isset($path)){ 
     return $current_path.$path; 
     } 
     else{ 
     return $current_path; 
     } 
} 
else{ 
    if (!isset($path)){ 
     $path = $current_path; 
    } 
    return getItemPath($proj_list, $current_parent_id, $path); 
} 
} 
+2

なぜ同じitem2とitem3が同じidを共有するのですか? – webbiedave

+0

最終出力はどのようになりますか? – Jon

+0

@webbiedaveそれはちょうどタイプミスです。すべてのIDはユニークであることを意図しています。 – zermy

答えて

1

再帰関数。 id = child.parent_idの配列要素を探します。次に、parent_id = ""または "0"の要素に達するまで、現在のparent_idをパラメータとしてselfを呼び出します。 ブレッドクラムのセグメントを親コールに返す必要があります。元のコールはルート全体を取得します。