Posted at

ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい


何がしたいか

例えば、ナビゲーションメニューに表示させたいリストが、項目A、項目B、項目C、項目Dの4つあるとします。項目Aのページを開いたときはナビゲーションメニューには項目A以外の3つが表示され、項目Bのページを開いたときはナビゲーションメニューには項目B以外の3つが表示され、・・・ということをしたい。つまり、ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい。

sihteicon.png

これを、PHPを使って実装します。


まず前提として…

ナビゲーションメニューの部分のHTMLは次のような構造です(CSSは省略)。


header.php

<header>

<nav>
<!-- ナビゲーションメニューの項目をaタグを使って作成 -->
</nav>
</header>

これをincludeを使って、ヘッダー部分に読み込みます


〇〇.php

<?php include('header.php'); ?>



ナビゲーションメニューをうんぬんかんぬんするPHPのコード

まずは、すべてのコードを載せます。


header.php

<?php

$navlist = [
['href' => 'itemA.php', 'name' => '項目A'],
['href' => 'itemB.php', 'name' => '項目B'],
['href' => 'itemC.php', 'name' => '項目C'],
['href' => 'itemD.php', 'name' => '項目D']
];
$filename = debug_backtrace()[0]["file"];

switch ($filename) {
case '・・・/itemA.php':
array_splice($navlist, 0, 1);
break;
case '・・・/itemB.php':
array_splice($navlist, 1, 1);
break;
case '・・・/itemC.php':
array_splice($navlist, 2, 1);
break;
case '・・・/itemD.php':
array_splice($navlist, 3, 1);
break;
}
?>

<header>
<nav>
<?php foreach ($navlist as $key => $value) : ?>
<a href="<?php echo $value['href']; ?>"><?php echo $value['name']; ?></a>
<?php endforeach; ?>
</nav>
</header>


次に、上のコードをいくつかのパートに分けて、軽く説明していきます。


ナビゲーションメニューの項目の名前と遷移先のページのパスを配列に格納


PHP

  $navlist = [

['href' => 'itemA.php', 'name' => '項目A'],
['href' => 'itemB.php', 'name' => '項目B'],
['href' => 'itemC.php', 'name' => '項目C'],
['href' => 'itemD.php', 'name' => '項目D']
];

あとで、この配列をループでまわして、navタグの中にaタグ<a href="〇〇">△△</a>を作っていきます。hrefキーの値は〇〇に、nameキーの値は△△に入ります。


header.phpがどのファイルから呼ばれたのかを取得


PHP

  $filename = debug_backtrace()[0]["file"];


ファイルのフルパスを返してくれるとかなんとか。上手く説明できないのでスルー。

PHP: debug_backtrace - Manual


header.phpの呼び出し先によって条件分岐


PHP

  switch ($filename) {

case '・・・/itemA.php':
array_splice($navlist, 0, 1);
break;
case '・・・/itemB.php':
array_splice($navlist, 1, 1);
break;
case '・・・/itemC.php':
array_splice($navlist, 2, 1);
break;
case '・・・/itemD.php':
array_splice($navlist, 3, 1);
break;
}

$filename・・・/itemA.phpなら(=header.phpがitemA.phpから呼び出されたのなら)、$navlist配列の中のitemA.phpと関連したデータ(['href' => 'itemA.php', 'name' => '項目A'])を削除する、というような処理をしています。

この処理を経ることで、配列には、呼び出し先のページ以外のページの情報だけが残ります。


配列をループ処理してaタグを作成


PHP

    <?php foreach ($navlist as $key => $value) : ?>

<a href="<?php echo $value['href']; ?>"><?php echo $value['name']; ?></a>
<?php endforeach; ?>

例えば、header.phpがitemA.phpから呼び出されたとしたら、前のswitch文の処理のおかげで、配列からitemA.phpに関するデータは消えました。このループ処理によって、itemB.php・itemC.php・itemD.phpのデータを使ってaタグが作成されます。

これで、ナビゲーションメニューの項目を動的に変化させることができます。


注意

・PHP初学者なので、説明が間違っているところがあるかもしれません。

・もっとスマートなやり方があればぜひ教えてください。