40日目:Ruby Ⅲ:関数の集合体メソッドを使いこなそう (メソッド、引数、戻り値、キーワード引数)
<学習日>
40日目
<学習内容>
① Ruby Ⅲ (0-100):関数の集合体メソッドを使いこなそう (メソッド、引数、戻り値、キーワード引数)
<参考>
Progateレベル:171
<学習内容詳細>
今日はRuby3つめの単元を完了させました^^
メソッドについて一通り勉強することが出来ました!
① Ruby Ⅲ (0-100):関数の集合体メソッドを使いこなそう (メソッド、引数、戻り値、キーワード引数)
基本的には詰まる可能性があるのは、「戻り値を使用した場合の値の動き方」と思いますが、もう他の言語で何回も少し複雑なcodeで頭を捻ってきたので、多少表現がことなる言語になっても、特に躓くことなく進めることが出来ました!
ではさっそく、具体的なcodeを見ながら、振り返っていきましょう^^
・メソッドの定義と呼び出し
メソッドとは処理をまとめて実行する関数のようなものである。
実際の定義と呼び出しは以下のとおり。
<定義>
def introduce
puts "こんにちは"
puts "薬膳です"
end
<呼び出し>
introduce
<出力>
こんにちは
薬膳です
呼び出すときは、メソッド名を出すだけでOK。
・引数を使用して、汎用的なメソッドを作成しよう。
引数とはメソッドを実行するときに、外部から個別の値を受け取る枠のようなもの。
具体的なcodeは以下のとおり。
<定義>
def introduce(name, age)
puts "こんにちは、私の名前は#{name}です。#{age}歳です"
end
<呼び出し>
introduce("薬膳"、30)
<出力>
こんにちは、私の名前は薬膳です。30歳です。
このように、複数の引数を設定でき、値を渡すことができる。ただし、呼び出し時には、引数と同じだけの値を指定する必要がある。
例では1人分だけだったが、100人分ともなるとこの方式の方が効率が良いし、WEBサービスを考えると、ユーザー登録時の情報をそのまま引っ張ってくれば、リストの作成が自動化できる。
・戻り値を使って、より汎用的な使い方が出来るようにしよう
戻り値とは、メソッドを呼び出したときに、その呼び出しもとに特定の処理をした後の値を返すことが出来る機能。
具体的な使用例は以下のとおり。
<定義>
def introduce(name)
return name
end
<呼び出し、受け取り、出力>
myname = introduce("薬膳")
puts "私の名前は#{myname}です"
<出力>
私の名前は薬膳です
値を数字や条件式にすると、プログラミングとしての汎用性が上昇するイメージ。今回の例は分かりやすさ重視だったが、数字の例の方がいいかも。
ということで、数字の場合は以下のとおり。
<定義>
def calc(a, b)
return a + b
end
<呼び出し、受け取り、出力>
sum = calc(2, 9)
puts "合計は#{sum}です"
<出力>
合計は9です
このように数字の計算結果を返すことが出来るので、様々なケースにおいて、計算結果によって表示を変えたりという応用が見据えられる。
また、条件式を返すこともできる。この場合はif文と組み合わせて、メソッド呼び出し時の値によって、出力を分けることが出来る。
<定義>
def rideon_ok?(a)
return a >= 120
end
<呼び出し、受け取り、出力>
if rideon_ok?(100)
puts "120cm以上なので乗れます"
else
puts "120cm未満なので乗れません"
end
<出力>
120cm未満なので乗れません
ここで注意したいのは、メソッド名の?の役割で、結論から言うと?はなくてもよい。
true or falseの値を持つメソッドは、慣例的に?を末尾につけるというだけ。
また、returnには「そこで処理終了」という機能があるので、ifと組み合わせることで、メソッド内で条件ごとに戻り値を変化させることが可能である。
(ifでtrueの時の処理内容がreturnだった場合、その条件式がtrueになった時点で、return以下の処理はなされない)
・キーワードで引数を指定する方法がある。
具体的なcodeは以下のとおり。
<定義>
def introduce(name:, age:, height:)
puts "こんにちは、私の名前は#{name}です。#{age}歳の#{height}cmです"
end
<呼び出し>
introduce(name:"薬膳", age:30, height:120)
<出力>
こんにちは、私の名前は薬膳です。30歳の120cmです。
ただ単にめんどくさいだけのように見えるが、汎用性がぐっと増す。
なお、ただの引数と違って、メソッドの呼び出し時に、値を各順番はどうでもよい。キーワードと紐づけして、メソッドに値を入れにいくからである。
例えば、呼び出しは
introcude(age:30, height:120, name:"薬膳")
でも全く同じ出力になる。
ということで、本日の勉強は終わりです。
次回からは、おそらく最後のキーワード引数をWEBアプリで汎用すると、どんな使い方があるのかを勉強できるのかなと予想しております^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
39日目:Ruby Ⅱ:nilとif文、要素にハッシュを持つ配列とeach文 (if nil条件式、each ハッシュ配列の繰り返し処理)
<学習日>
39日目
<学習内容>
① Ruby Ⅱ(61-100%):nilとif文、要素にハッシュを持つ配列とeach文 (if nil条件式、each ハッシュ配列の繰り返し処理)
<参考>
Progateレベル:168
<学習内容詳細>
今日はRubyの2つ目の単元を終わらせました^^
他の言語で苦しんだeach文を用いた繰り返し処理でしたが、さすがに何回も今まで似たことを繰り返してきたので、問題なく学習完了です!
① Ruby Ⅱ(61-100%):nilとif文、要素にハッシュを持つ配列とeach文 (if nil条件式、each ハッシュ配列の繰り返し処理)
さてRubyの基礎編あたりが終了した感じでしょうか。
nilをfalse扱いにする特性を用いてif文の条件式にぶっこめるという内容は、私にとっては初耳で勉強になりました。
後半のeach文+ハッシュを要素に持つ配列で繰り返し処理を実施する、という内容はそこそこプログラミングっぽくて好きなのですが、すでにほかの言語で概念は理解しており、あまり学ぶことはなかったかなという印象です^^;;
ではさっそく、実際のcodeを挙げながら、振り得っていきます!
・値がない場合は「nil」という値が返ってくる。ここで「nil」には「false」と同じ意味があることを利用して、「if」文と組み合わせることが出来る。
例えば、指定の値にデータが入っている時にはその値を、値が入っていないときには別の文言をアウトプットする場合は、以下のとおり。
test = {name:"math" }
if test[:point]
puts test[:point]
else
puts "点数は分かりません"
end
このように、点数のデータがあるときには、その点数をアウトプットし、点数のデータがない場合は「点数はわからない」というコメントを出力することが出来る。
ifの後の条件文が条件文っぽくないけれど、ここで「nil」が返ってきた場合には「false」と同じ解釈をif文がすると考えればよい。
・要素がハッシュの配列の扱い方
例を挙げると次のような使い方をする。
users = [
{name:"Ken", age:25}
{name:"John", age:30}
]
puts users[0][:age] ⇒ 25がアウトプットになる。
出力時には、配列のいくつめのハッシュかを最初に指定して、続けてハッシュのキーを指定すると、対応する値を呼び出せる。
また「each」と組み合わせることで、ハッシュを要素に持つ配列を定義するだけで、一気に大量のアウトプットを出力できる。
例えば上記のusersの配列に対して、以下のような使い方をする。
users.each do |user|
puts "#{user[:name]}の年齢は#{user[:age]}歳です"
end
⇒
Kenの年齢は25歳です
Johnの年齢は30歳です
というアウトプットになる。eachにはendが必要なので、忘れないように注意する。
さらに年齢が不明な人がいるような場合には、each文の中にif文を組み込む。具体的には以下のとおり。
users.each do |user|
if user[:age]
puts "#{user[:name]}の年齢は#{user[:age]}歳です"
else
puts "#{user[:name]}の年齢は不明です"
end
end
if文に対するendと、each文に対するendの両方を忘れないように注意する。
明日からはより実用的なRubyの実用例について学べると思っています!
ワクワクですね^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
38日目:Ruby Ⅱ:配列とハッシュを使おう(配列、インデックス、ハッシュ、キー)
<学習日>
38日目
<学習内容>
① Ruby Ⅱ(0-60%):配列とハッシュを使おう (配列、インデックス、ハッシュ、キー)
<参考>
Progateレベル:166
<学習内容詳細>
本日はRubyの続きを進めていきました^^
今日の内容も、他の言語で勉強した概念だったので、比較的サクサクと進めることがあ出来ました!
① Ruby Ⅱ(0-60%):配列とハッシュを使おう (配列、インデックス、ハッシュ、キー)
はい、ということで基本的には配列やハッシュを扱う導入編という感じです!
ハッシュという言葉はプログラミングの勉強をし始めてからは初めてですが、PHPでいうところの連想配列と同じです^^
ではさっそく具体的なcodeをみながら、進めていきましょう。
・配列について
複数のデータを持つデータのことを「配列」という
具体的には以下のとおり。
names = ["Ken", "John", "Taro"]
このように、変数に配列を定義することが可能である。
また、配列には左から順番に数字を振ってあり、これをインデックスという。
0から始まり、順番に増えていく。
上記の例でインデックスを指定せず出力した場合と、指定して出力した場合を具体的に示すと以下のとおり。
puts names ⇒ Ken John Taro
puts names[1] ⇒ John
・繰り返し処理
eachを用いる方法についての具体的なcodeは以下のとおり。なおnames配列は、上記のものとする。
names.each do |name|
puts "彼の名前は#{name}です"
end
これで出力は以下のとおりとなる。
彼の名前はKenです。
彼の名前はJohnです。
彼の名前はTaroです。
・ハッシュとは
配列がただの値の羅列であったのに対して、ハッシュとは「キー」と「値」が紐づけられた配列である。
具体的なcodeとしては、以下のとおりである。
man = {"name" => "Ken", "age" => 20, "height" => 178}
ハッシュをそのまま呼び出すと、ハッシュのまま出てくる。これは配列をそのまま呼び出すと、配列の中身が整理されて出てくるのと対照的。
puts man ⇒ {"name" => "Ken", "age" => 20, "height" => 178}
これだと使いようがないので、基本的にハッシュを用いる場合には、ハッシュとキーを組み合わせてアウトプットさせる。
puts man["age"] ⇒ 20
のようになる。
また、キーの中の値の書き換えや、新しいキーと値の組み合わせの追加は、後から以下のようにcodeを書けば実行できる。
man["name"] = "John" :これでmanハッシュのnameの値はJohnに修正される。
man["weight"] = "70" :これでmanハッシュに、weightキーが追加され、値は70となる。
このように、修正も追加もcodeは一緒であり、すでにあるキーを指定した場合は修正になり、ないキーを指定した場合は追加になる。
なおハッシュには3種類書き方があるので全て列挙すると以下のとおりであり、一番下の省略形が一番よくつかわれる。
man = {"name" => "Ken", "age" => 20, "height" => 178}
man = {:name => "Ken", :age => 20, :height => 178}
man = {name: "Ken", age: 20, height: 178}
下2つの書き方をした場合は、呼び出すときも少し方法が異なり、以下のように""ではなく:で呼び出すこと。
puts man[:name]
はいということで、今回はここで終わりです。
次回からはnilというnodataの処理の仕方を勉強していきます!
感想というのかなんというのか、ハッシュの省略形がPHPではデフォで出てきたので、どちらかというと省略前の書き方が違和感がありましたね^^;;
短いは正義ですので、きっと省略形に慣れておけば大丈夫と信じています!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
37日目:Ruby Ⅰ:まずはRubyを触ってみる 慣れたら簡単な条件分岐を作成する
<学習日>
37日目
<学習内容>
① Ruby (0-100%):まずはRubyを触ってみる 慣れたら簡単な条件分岐を作成する(puts、文字列連結、四則演算、展開関数、条件分岐)
<参考>
Progateレベル:163
<学習内容詳細>
日本ではまだまだ現役のRubyについて勉強していきます^^
全世界的にRubyの人気は右肩下がりではありますが、まだまだ国内での現場では使用率が高いので、勉強の価値がないわけではない。
むしろ初学者であれば、ある程度は知っておく必要がある言語であると思います。
(特に海外でプログラマーとして就職するわけでないのであれば)
ではではさっそく単元の内容に入っていきましょう!
① Ruby (0-100%):まずはRubyを触ってみる 慣れたら簡単な条件分岐を作成する(puts、文字列連結、四則演算、展開関数、条件分岐)
はい、ということで、最初の単元なので超簡単です。
項目数は多いですが、逆に1つ1つが「こんなcodeあるよ」くらいのノリなので、サクサク進められます^^
また、ここまででPHPやJavaも学習してきているので、内容自体は殆ど変わらず、少し書き方が違う部分があるのかなくらいでした^^;;
ではさっそく実際のcodeも挙げながら、振り返っていきます!
・値を表示させる
puts 値
・codeの実行性のないコメントを残す
# コメント
シャープの列はcodeが実行されず、アウトプットに何も影響しない
・文字列と数字は明確に異なる
””や’’で囲った中身は、文字列として認識される。
puts 8 + 2 ⇒ 10
puts "8 + 2" ⇒ 8 + 2
と表示される。
・文字列を連結させたい場合
puts "私は" + "人間だ" ⇒ 私は人間だ
・変数には文字列も、数字も値として入れることが出来る
text = "こんにちは"
puts text ⇒ こんにちは
width = 4
height = 3
puts width * height ⇒ 12
変数を使って、連結や数字計算も可能
・変数の命名時に2語以上の単語から付けた名前は_で繋ぐこと
○user_name
×usernameとかuserName
PHPだと2単語目以降の頭文字を大文字にするだったのに、Rubyだとアンダーバーで繋ぐ文化みたい
・変数は後から更新したものが優先される
width = 7
処理A
width = 13
処理B
この場合、「処理Aではwidthは7」と扱われ、「処理Bではwidthは13」と扱われる。
・変数に特定の演算をする場合
name = 1
足し算:name += 2
引き算:name -= 2
掛け算:name *= 2
割り算:name /= 2
余り:name %= 2
で表現できる。
・展開関数:文字列の中に変数を突っ込む方法
例えば「私は○○歳です」という文章を書きたくて、○○の部分を変数で定義していたとしたら、以下のようなcodeとなる。
puts "私は#{age}歳です"
なお、””でないと変数が展開されないので注意が必要。
・大小比較の演算子
Aより大きい:変数 > A
A以上:変数 >= A
Aより小さい:変数 < A
A以下:変数 <= A
Aと同じ:変数 == A
Aと違う:変数 != A
・条件分岐(if、elsif、else)
例えばscoreが100点だったら”すばらしい”、60点以上だったら”合格です”、60点未満だったら”不合格!”と表示させたい場合のcodeは以下のとおり。
if score == 100
puts "素晴らしい"
elsif score >= 60
puts "合格です"
else
puts "不合格!"
end
elsifでeが省略されるのが面白かった。
・条件式の「かつ」「または」
かつ:条件式A && 条件式B …
または:条件式A || 条件式B …
・全体的に衝撃だったのは、;などで演算実行を区切るコマンドが一切なかったこと。書くのは手間じゃないけど、逆に読みにくいような気もする。
こんな感じです。どちらかというとcode表みたいになっちゃいましたね^^
次の単元以降、どんどん骨太になってくると期待しています!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
36日目:Command Line学習:一通りの基本的なコマンドと階層構造について学ぶ
<学習日>
36日目
<学習内容>
① Command Line (0-100%):一通りの基本的なコマンドと階層構造について学ぶ
<参考>
Progateレベル:154
<学習内容詳細>
本日は一転して「Command Line」について勉強しました^^
これは「cmd」とか打ち込むと出てくる「真っ黒い背景」のウィンドウで実行するものになってきます。
windowsだと「コマンドプロンプト」と呼ばれるやつですね。
完全にcodeのみで色々な作業を実行するので、かなり取っつきにくい部分となります。
レッスン一覧を見ていたら、Progateでも取り扱っていたので、どんなもんかと手を出してみました^^
結論からいうと、初歩の初歩というのか、かなり基本的な内容となっておりましたが、導入としては良いかなと思います。
(時間もあまりかからないので)
① Command Line (0-100%):一通りの基本的なコマンドと階層構造について学ぶ
ということで、さーっと一通りProgateの単元は完了させてしまいました^^
では、実際のcodeも記載しながら、本日勉強したことを振り返っていきます!
・新しいファイルを作成する場合
「touch ファイル名」でそのファイルを作成することができる。具体的に、get.txtというファイルを作成したい場合には以下のとおり。
$ touch get.txt
・ファイルの中身を表示する場合
「cat ファイル名」でそのファイルの中身を表示させることができる。具体的に、get.txtというファイルを作成したい場合には以下のとおり。
$ cat get.txt
なお、指定したファイルが見当たらない場合には、「cat: get.txt: No such file or directory」というエラーメッセージがでる。
また、TABボタンを押すことで、実際に存在するファイル名を予測で出すことができる(補完機能)。
・フォルダを新規作成する場合
「mkdir フォルダ名」でそのフォルダを作成することができる。具体的に、sampleというフォルダを作成したい場合には以下のとおり。
$ mkdir sample
ちなみに、我々が良く使うフォルダという名称だが、プログラミングの世界ではディレクトリと呼ばれる。「フォルダ = ディレクトリ」という認識をもつべし。
また「touch」コマンドではディレクトリは作れないので注意。ファイルとディレクトリは明確に区別されている。
・Command Lineでの作業は、常に「どこの場所で作業をしているのか」を意識する必要がある
例えば、我々がデスクトップで新しいフォルダを作成するときはデスクトップで、他の階層のフォルダ内にファイルをコピーする場合はそのフォルダ内で実施する。それと同じで、Command Lineで作業を指示する場合でも、「この命令はどの場所に対して実行してるのか」を明確にしないと、正しい作業が出来ない。
この時、作業したい場所まで行くときには「cd アクセスしたいディレクトリ名」と指定指定する。
例えば、sampleというフォルダ内で作業したい場合には、以下のとおりのcodeとなる。
$cd sample
上記のコマンドを実行すると、次の行から「sample $」が頭に表示された状態になる。この表示を持って、次回の命令は「sample」というディレクトリ上で実行するぞ、という意味になる。
・今いるディレクトリの場所が全体の構造のどこにあるのかを表示する方法
フォルダの構造は樹形図のようになっており、大元のディレクトリから辿って、どの位置にいるのかを正しく把握しておく必要がある。
その時には「pwd」というコマンドを用いる。main⇒example⇒sampleという構造になっていた場合のcodeと、リプライは以下のとおり。
sample $ pwd
/main/example/sample
ちなみに、一番おおもとのディレクトリを「ルートディレクトリ(/)」というので覚えておくこと。
・今いるディレクトリに属している1つ下の階層をリストで表示する場合
「ls」を使用する。例えば、sampleディレクトリに属する、1つ下の階層の一覧を表示する場合には、いかのとおり。
sample $ ls
これで、このディレクトリに属している「ファイル/ディレクトリ」がリストで表示される
・1つ上の階層のフォルダに行く場合
「cd ディレクトリ名」がエラーになってしまう。sampleディレクトリから、exampleディレクトリに移動する場合は、以下のとおり(main⇒example⇒sampleとして)。
sample $ cd ..
cdコマンドは、1つ下の階層にしか行けないみたい。同一階層での移動も、1つ飛ばしての移動も試したけど出来なかった。
・cdの後にディレクトリ名を指定しないとどうなるなるのか⇒「homeディレクトリ」に移動できる
ユーザーが開発時に起点とするディレクトリを「homeディレクトリ」として設定することができる。
cdのあとにディレクトリ名を指定しないと、設定された「homeディレクトリ」に移動することができる。
・ファイルやディレクトリを移動したい場合
「mv 移動したいファイル名/ディレクトリ名 移動先のディレクトリ名」でファイルやディレクトリを移動することが出来る。
例えば、sampleファイルを、subディレクトリに移動したい場合は以下のとおり
$ mv sample sub
ちなみに、移動したい先のディレクトリよりも上層のディレクトリからでないと、正しくコマンドが実行されないっぽい。
・ファイル名を変更したい場合
この時も「mv」を使用する。「mv 名前を変更したいファイル名 変更後のファイル名」で実行できる。
たとえばsample.txtというファイル名を、ttt.txtという名前に変更したい場合は以下のとおり
$ mv sample.txt ttt.txt
ちなみに、このファイル名を変更する命令は、そのファイルが格納されているディレクトリにいないと実行できないっぽい。
(すごく上のディレクトリからだとだめ。ちなみにTABによる補完も、今いるディレクトリに直接紐づいているファイル名しか補完されない)
・ファイルをコピーしたい場合
「cp ファイル名 コピー後のファイル名」でコピーできる。またディレクトリをコピーしたい場合は「cp -r ディレクトリ名 コピー後のディレクトリ名」でコピーできる。
例えば、samle.txtをコピーして、ttt.txtという名前にする場合は以下のとおり。
$ cp sample.txt ttt.txt
また、mainというディレクトリをコピーして、subという名前を付けたい場合は以下のとおり。
$ cp -r main sub
このコマンドも、1つ上のディレクトリから実行しないとだめっぽい。
・ファイルを削除したい場合
「rm ファイル名」で削除できる。またディレクトリを削除したい場合は「rm -r ディレクトリ名」で削除できる。
例えば、samle.txtを削除する場合は以下のとおり。
$ rm sample.txt
また、mainというディレクトリを削除したい場合は以下のとおり。
$ rm -r main
このコマンドも、1つ上のディレクトリから実行しないとだめっぽい。
・最近使ったコマンドをもう一度実行したい場合⇒「矢印キーの↑ボタン」で、最近実行したコマンドが呼び出せるので便利
ということでつらつらと書きましたが、超導入編であり、複雑な概念や内容はありませんでした。
ただ、ちょっと触ってみるとわかる仕様は結構大事で、ディレクトリの移動なんて何階層分もすっとばしていけるだろうと思っていたら、一つずつしか移動できなかったりとかはやってみないと気付けませんでした^^;;
これもなぜだろうと考えてみると、実は答えは明確で「同じファイル名/ディレクトリ名が階層が違えば許されるから」だと思います。
つまり、「メイン」というディレクトリに行って欲しいという命令を出しても、「デスクトップにあるメインというディレクトリ」なのか、「ダウンロードにあるメインというディレクトリ」なのかが判別できないから、一気に移動しようがないということですね。
同様の理由で、今いるディレクトリに直接続しているファイル/ディレクトリにしか、命令を実行することは出来ない仕様になっていると考えています!
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
35日目:PHP 学習:複数クラスの横断情報管理(レビュー者とコメント紐づけ、レビュー者の属性とアイコンの紐づけ)
<学習日>
35日目
<学習内容>
① PHP Ⅳ(58-100%):複数クラスの横断情報管理(レビュー者とコメント紐づけ、レビュー者の属性とアイコンの紐づけ)
<参考>
Progateレベル:147
<学習内容詳細>
なんとか、PHPの全単元を完了することが出来ました!
後半はcodeが膨大になってきて、なかなかどの引数をどこで受けて、この関数はどういった経路でなにを引っ張ってきているのか、全体像を把握するのが難しく、実際にcodeを書いている時間よりも、熟考する時間の方が長かった気がします^^;;
なんと、分割ファイルが2桁に!(0 0)
総じて言えることとして、Progateは「細かい指示に従っていれば脳死でもこなせる」ように出来てしまっているので、ポイントポイントで「もし白紙の状態だったらどうするか」と考えながら学習することが大切だと思います^^
そのうえで「ああ、そういくことか」と腑落ちする瞬間が楽しみでもありますから、「進めること」を目標にするのではなくて、「腑落ちすること」を目標にしてこれからもやっていこうと思います!
① PHP Ⅳ(58-100%):複数クラスの横断情報管理(レビュー者とコメント紐づけ、レビュー者の属性とアイコンの紐づけ)
関数を使いながら、複数作成しているクラスやインスタンスごとの情報をやりとりする内容が多かったです。
関数については、基本的にforeachで対象となるインスタンスを全て参照しつつ、条件に一致するインスタンスのみを抜き出して、実際のHTMLで抽出したデータでページを作成するという流れになっています^^
PHP学習の全体的な方針というのか、構成については閃き集でまとめることにして、今回は少し複雑な情報のやり取りを、具体的なcodeをあげながら振り返ります。
今回例に出すのは2つのcodeです!
・特定のメニューのインスタンス情報だけを反映させる
メニュー一覧から、特定のメニューをクリックしたときに、そのメニューについてのインスタンス情報だけが表示させるような機能を想定。同一クラスで管理。
【index.php】
foreach($menus as $menu)文の中で
<a href="show.php?name=<?php echo $menu->getName() ?>">
【show.php】
<?php
require_once('menu.php');
require_once('data.php');
$menuName = $_GET['name'];
$menu = Menu::findByName($menus, $menuName);
$menuReviews = $menu->getReviews($reviews);
?>
【menu.php】
public static function findByName($menus, $name) {
foreach ($menus as $menu) {
if ($menu->getName() == $name) {
return $menu;
}}}
解説1:「index.php」でボタンを押すと、そのメニューの名前の情報を「show.php」に飛ばす
解説2:「show.php」で飛ばされてきたメニューの名前を、「$menuName」で受ける。
解説3:「findByName()関数」で、クリックしたメニューの名前と同じ名前のプロパティをもつ「メニューインスタンス」を取得する。
解説4:得られたメニューインスタンスに格納された情報で、「show.php」を構成すれば、クリックしたメニューに関係する情報だけで構成されたページが作成できる。
・メニューごとに、そのメニューについてのレビューを取得する
メニュー一覧から、特定のメニューをクリックしたときに、そのメニューについてのレビューのみ表示させるような機能を想定。なお、レビューは別インスタンス管理としている。
【menu.php】
public function getReviews($reviews) {
$reviewsForMenu = array();
foreach ($reviews as $review) {
if ($review->getMenuName() == $this->name) {
$reviewsForMenu[] = $review;
} }
return $reviewsForMenu;
}
解説1:「レビュークラス」に「メニューの名前」プロパティを入れておく
解説2:空の配列を用意して、そこに「レビューに格納されたメニューの名前」と「メニューページのメニューの名前」が一致している時だけ、そのレビューインスタンスを格納するようにする。
解説3:最後に解説2で条件に一致した「レビューインスタンス」のみ格納された配列を、この関数に「return」で値として返す。
ということで、どうだったでしょうか。
基本的にプログラミングも「プログラミング言語」ですから、日本語に翻訳可能です。
数学と同じですね^^
優れた数学者が、日常言語以上の親和性で数式を脳内処理するのと同じで、優れたプログラマーは日常言語以上の親和性性で、プログラミング言語を脳内処理しているのだと思います!
そうはなれないでしょうし、なるつもりもありませんが、実用的な範囲であれば「日本語に翻訳できる」と思って理解すれば、意外にすんなり頭に入ってくるような気がします^^
ではでは、1日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!
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日でも長く続けられるように頑張っていきます^^
同志の方、一緒に頑張っていきましょう!