34日目:PHP 学習:多機能なメソッドを開発し活用する(vlookup関数的メソッド/配列から条件にあう要素だけを取り出して再配列化するメソッド)
<学習日>
34日目
<学習内容>
① PHP Ⅳ(22-57%):多機能なメソッドを開発し活用する(vlookup関数的メソッド/配列から条件にあう要素だけを取り出して再配列化するメソッド)
<参考>
Progateレベル:146
<学習内容詳細>
さすがにPHP最後の単元!
お、重いっ!!
今日はそこそこ時間を充てたのですが、内容が濃くてなかなか進捗具合としては進みませんでした^^;;
が、学習した内容自体は多かったと思うので、十分満足です!
① PHP Ⅳ(22-57%):多機能なメソッドを開発し活用する(vlookup関数的メソッド/配列から条件にあう要素だけを取り出して再配列化するメソッド)
はいということで、今回は目次を見ただけでは、内容が殆どわかりませんね^^;;
前回からの違いとしては、割と機能性を持ったメソッドを、しっかりと関数として作成して、クエリ情報等を反映しながら活用し始めたという点です!
はい、かなり重かったです。。。が、思った通りの動作をしたときや、レッスンのcodeを納得できるまで自分で紐解いていき、「おおっ、そういくことか!」となった瞬間は気持ちがいいですね^^
そこまでちゃんと考えると、時間ばっかり過ぎてしまったりもしますが、「熟考すること」もプログラミング学習の1つの目的だったりするので、むしろ願ったりです!
では、具体的なcodeを挙げながら、今回の学習を振り返ります^^
(今回は日本語の補足が多いかもです^^;;)
・繰り返し関数foreachの中で、ある条件に一致した特定のインスタンスの情報を読み出すには
具体的な状況としては、次のとおり。
複数のメニューを一覧形式として表示しているページで、気になったメニューをクリックすると、その個別のメニューの詳細ページにいけるようにしたい。
このとき、「閲覧者がクリックしたのはどのメニューか」という情報を受けて、その情報と合致する詳細ページを表示させる必要があると考える。
では、具体的なcodeを紹介しながら、理解していく。
◇クラスの中で、閲覧者がクリックしたメニューの情報を抽出するメソッドを作成する。今回はfindMenu()とする。
public static function findMenu($menus, $name){
foreach($menus as $menu){
if($menu->name == $name){
return $menu;
}
}
}
日本語でかみ砕くと、色々なインスタンスデータの中の「name」データが、ここの引数としてうけている「$name」と一致するかどうかを「if文」で判別して、もし一致した場合は「findMenu()」にそのときのインスタンスを「return」するという内容になる。
◇メニュー一覧ページの各メニューの詳細ページとぶリンクに、そのメニュー特有の情報(クエリ情報)を付加する(HTML_code内)
<?php foreach($menus as $menu): ?>
…
<a href="show.php?name=<?php echo $menu->getName() ?>">
<?php end foreach ?>
◇「show.php」がメニュー詳細ページだが、ここでクエリ情報を受け取り、このページ内における「$menu」に「findName()」で抽出したインスタンスを代入する。
そのうえで、そのインスタンス情報に基づいたデータをつかって、詳細ページを「閲覧者がクリックしたメニュー」の情報で構成する。
<?php
…
$menuName = $_GET['name'];
$menu = Menu::findName($menus, $menuName)
?>
HTML_code内にて「echo $menu->getメソッド」をちりばめることで、クリックしたメニューのインスタンスから、必要なそのメニューに関する情報を得ることができる。
・foreach($menus as $menu)のおさらい
以下のcodeを日本語でかみ砕いた翻訳と一緒に記述すると、以下のとおり。
foreach($menus as $menu){
$menuを使った処理
}
$menusは配列としてすでに規定されていて、$menuを使って記述された処理の中に、$menusの要素を1つずつ全て代入して実行するよ、という意味。
codeが複雑になっていくなかで、若干あやふやになりかけていたので、念のためのおさらいでした。
・変数には「どういう型のデータが入っているのか」を強く意識する。
codeが長くなっていくにつれて、今この変数にはどういう値が入っているのかについて、混乱するときがある。
その場合は順をおって、読み解いていく癖をつけよう。
たとえば以下のようなcodeを、日本語でかみ砕くとつぎのとおり
public static function findByName($menus, $name){ ⇐②
foreach ($menus as $menu) {
if ($menu->getName() == $name) {
return $menu;
}}}
$menuName = $_GET['name'];⇐①
$menu = Menu::findByName($menus, $menuName);⇐②
$menuReviews = $menu->getReviews($reviews);⇐③
①クリックしたときに、そのメニューのインスタンスをクエリとして情報し、リンク先のページで取得する
②クエリ情報を引数として、元クラスの関数を実行させる。その値を「$menu」に格納する。$menuは特定のインスタンスになる。
③すでに決まっている特定のインスタンスにて「getReview($reviews)」を実行して、その値を「$menuReviews」に格納する。
※findByNameメソッドは、特定のnameデータをもつインスタンスを検索してそのインスタンスを返すメソッド
※getReviewsメソッドは、特定のnameデータをもつインスタンスを、強制的に配列に全て組み込み、最後に配列を返すメソッド
関数が入り乱れてくると、変数にどういった値がどういう型で入ってくるのか、都度熟考しないとぐちゃぐちゃになる。
試行錯誤しながら、なんとか理解しようとしている様子が見て取れますね;;
まだ半分くらい残っているので、じっくりがんがん進めていきたいと思います^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!