0 レビュー
2 回答
php-メニュー配列を再帰的に作成します
メニュー項目を含む単一の配列があります。各アイテムには、parent_idがあります。私は何時間も検索して試していますが、配列を再帰的にトラバースする方法がわかりません。再帰が苦手です。
次の投稿のコードを使用しようとしました。 htmlメニューを生成しますが、最初のレコードが欠落しています。また、配列が必要なので、配列からカスタムhtmlメニューを作成できます。
他の投稿からこのコードを試しましたが、空の配列が返されます。
create_array(-1, $array);
function create_array($number, $data)
{
$result = array();
foreach ($data as $row)
{
if ($row['parent_id'] == $number)
{
$result[$row['id']] = create_array($row['id'], $data);
}
}
return $result;
}
データ配列:
Array
(
[0] => Array
(
[id] => 1
[parent_id] => -1
[url] => /home
)
[1] => Array
(
[id] => 2
[parent_id] => 0
[url] => /page
)
[2] => Array
(
[id] => 3
[parent_id] => 2
[url] => /page/sub_page
)
[3] => Array
(
[id] => 4
[parent_id] => 3
[url] => /page/sub_page/inner_page/
)
)
望ましい結果:
home - page
sub_page
inner_page
ご協力いただければ幸いです。
わからない
0
レビュー
答え :
解決策:
まず、親として0を使用して印刷します。それぞれが子を見つけて、子ごとにやり直します。
次のようなもの:
function menu($data,$parent=-1) {
$res='';
foreach($data as $e) {
if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) { //Also search for 0 when parent is -1 as are both the roots
$res.='<li>'.$e['url']; //Or whatever you want to show
$sub=menu($data,$e['id']);
if($sub) $res.='<ul>'.$sub.'</ul>';
$res.='</li>';
}
}
return $res;
}
<ul><?=menu($data)?></ul>
わからない
0
レビュー
答え :
解決策:
Gabrielのおかげで、彼のメソッドを使用して、メニューの配列を返す別のメソッドを作成しました。
$data = array(
array('id'=>1, 'parent_id'=>-1, 'url_title'=>'home', 'url'=>'/home'),
array('id'=>2, 'parent_id'=>0, 'url_title'=>'page-one', 'url'=>'/page-one'),
array('id'=>3, 'parent_id'=>2, 'url_title'=>'sub-page', 'url'=>'/sub-page'),
array('id'=>4, 'parent_id'=>3, 'url_title'=>'inner-page', 'url'=>'/inner-page')
);
function menu_html($data,$parent=-1) {
$res='';
foreach($data as $e) {
if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) {
$res.='<li>'.$e['url'];
$sub=menu_html($data,$e['id']);
if($sub) $res.='<ul>'.$sub.'</ul>';
$res.='</li>';
}
}
return $res;
}
echo '<ul>'.menu_html($data).'</ul>';
function menu_array($data,$parent=-1) {
$res=array();
foreach($data as $e) {
if($e['parent_id']==$parent||($parent==-1&&$e['parent_id']==0)) {
$res[$e['url']] = $e;
$sub=menu_array($data, $e['id']);
if($sub) $res[$e['url']]['sub-nav'] = $sub;
}
}
return $res;
}
echo "<pre>";
print_r(menu_array($data));
echo "</pre>";
出力:
/home
/page-one
/sub-page
/inner-page
Array
(
[/home] => Array
(
[id] => 1
[parent_id] => -1
[url_title] => home
[url] => /home
)
[/page-one] => Array
(
[id] => 2
[parent_id] => 0
[url_title] => page-one
[url] => /page-one
[sub-nav] => Array
(
[/sub-page] => Array
(
[id] => 3
[parent_id] => 2
[url_title] => sub-page
[url] => /sub-page
[sub-nav] => Array
(
[inner-page] => Array
(
[id] => 4
[parent_id] => 3
[url_title] => inner-page
[url] => inner-page
)
)
)
)
)
)
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。