Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

何がしたいか

例えば、ナビゲーションメニューに表示させたいリストが、項目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初学者なので、説明が間違っているところがあるかもしれません。
・もっとスマートなやり方があればぜひ教えてください。

ryoo_ss
無職系フロントエンドエンジニア。 ランサーズとかココナラとかを通してぜひ依頼してください。 ランサーズ https://www.lancers.jp/profile/ryoo_s_s?ref=header_menu ココナラ https://profile.coconala.com/users/957219
https://ryo.dev/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away