、私はこれをお答えします。私はまたあなたの質問が"動的"それほどハードコードされていないことを意味すると理解しています。
第1に、最終製品はあなたが見せているものではありませんが、期待される出力のセットアップ方法はやや冗長です。定義によって、別の配列の下にある塗りつぶし配列は子("子" "")なので、 "childs"というサブ配列に格納する必要はありません。
このアレイを作成するには、アレイを作成できるようにする必要がありますが、そのアレイを作成するときと同じアレイをトラバースする必要があります。あなたは、孤児を作らないことに注意しなければなりません。つまり、あなたはid_parent
の値を持っていますが、メイン配列には対応するid
はありません。余分なスクリプトなしでメニューに表示されません。
視聴者が盲目的にコピーして貼り付けるのではなく、何が起こっているのかを理解できるように私はメモしました。 PHPのObject Oriented Recursive Array Iterator(または他の反復子クラス)を実際に利用していないので、それらを調べるべきです。あなたは、より効率的に同じことを達成することができる場合があります
# Main array with parents/children
$array = array(
array(
'id'=>1,
'id_parent'=>0
),
array(
'id'=>2,
'id_parent'=>0
),
array(
'id'=>3,
'id_parent'=>0
),
array(
'id'=>4,
'id_parent'=>0
),
array(
'id'=>5,
'id_parent'=>2
),
array(
'id'=>6,
'id_parent'=>2
),
array(
'id'=>7,
'id_parent'=>3
),
array(
'id'=>8,
'id_parent'=>7
),
array(
'id'=>9,
'id_parent'=>8
)
);
/*
** @description This function is a recursive iterator, meaning it will
** traverse the current array and all children
** @param $curr [string|int] This is the current id value being ready to place
** @param $parent [string|int] This is the current parent id being searched
** @param $arr [array] This is the array that is being built for the menu structure
** @param $array [array] This is the array pool of ids and parent ids. We are going to pass by reference
** to update this array as we go to fix chicken-before-the-egg scenarios
** @param $rKey [int] This is the current key being iterated on in the main array pool
*/
function recurse($curr,$parent,$arr,&$array,$rKey)
{
# Loop through our menu array to try and match parents
foreach($arr as $key => $value) {
# If there is a match
if($parent == $key) {
# Remove the key/value pair from main array
unset($array[$rKey]);
# Add the id to our menu array
$arr[$key][$curr] = array();
}
# If there is no immediate parent match
else {
# If the value is an array, try and now look through it for parent, else just continue
$arr[$key] = (is_array($value))? recurse($curr,$parent,$value,$array,$rKey) : $value;
}
}
# Send back this current array
return $arr;
}
/*
** @description This function takes your pool of ids and loops through them, sorting the menu items
*/
function getMenuArray($array)
{
# This is the final storage array
$arr = array();
# First count to see how many are available
$count = count($array);
# Start looping
for($i=0; $i<$count; $i++) {
$row = $array[$i];
# If there are no parents, the just assign base menu
if(empty($row['id_parent'])) {
$arr[$row['id']] = array();
# Remove this key/value pair from main array since it's been used
unset($array[$i]);
}
else {
# Recurse what we currently have stored for the menu
$new = recurse($row['id'],$row['id_parent'],$arr,$array,$i);
# If the recurse function didn't find it's parent
if(isset($array[$i])) {
# add it to the back of the array
$array[] = $row;
# Remove the current array
unset($array[$i]);
# Recount how many are left to iterate through
$count = count($array);
}
# If the parent was found
else
# Assign the $new array
$arr = $new;
}
}
# Return the array
return $arr;
}
print_r(getMenuArray($array));
あなたは与える:
Array
(
[1] => Array
(
)
[2] => Array
(
[5] => Array
(
)
[6] => Array
(
)
)
[3] => Array
(
[7] => Array
(
[8] => Array
(
[9] => Array
(
)
)
)
)
[4] => Array
(
)
)
をだからあなたは何を試してみましたか? –
ダイナミックとPHP? AJAX。 – PHPglue