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


何がしたいか

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

これを、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初学者なので、説明が間違っているところがあるかもしれません。
・もっとスマートなやり方があればぜひ教えてください。