この場合に必要なロジックは単純かどうかは分かりませんが、わかりませんでした。それで、私は助けを求めています。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);
}
}
なぜ同じitem2とitem3が同じidを共有するのですか? – webbiedave
最終出力はどのようになりますか? – Jon
@webbiedaveそれはちょうどタイプミスです。すべてのIDはユニークであることを意図しています。 – zermy