この章では関数の仮引数に配列を渡す方法について説明します。
ユーザー定義関数の仮引数には配列も渡すことが出来ます。
配列(array(3,8,4,8))を仮引数の$numberに代入して、その配列の個々の要素をforeachで取り出して合計を算出しています。 結果は以下の通りです。
「合計は23です」
次の例は呼び出し元に配列を返す例を紹介します。 この例は戻り値が配列になっていまして、$resultに戻り値を代入しています。
そして、配列$resultの要素をforeachですべて取り出しています。
これにより足し算と引き算の結果を同時に呼び出し元に返すことが出来ます。
結果は以下の通りです。
15
9
投稿者: 無漏路
ユーザー定義関数について知ろう
この章ではユーザー定義関数について説明します。
関数とは入力したデータに基づいて決められた処理を行い、戻り値を返す機能を持っていますと説明しました。
これまで説明した関数はPHPによって始めから用意されている関数です。
例えばは配列の1番上に要素を追加する関数ですが、初めからPHPの内部機構でそのような働きを作ってくれています。
ユーザー定義関数では自身で好きなように、ある働きを持った関数を作ることができます。例えば消費税を自動で計算する関数を自分で作りたいとします。
その場合、商品の代金を関数に渡すと関数は商品金額に消費税額を掛けた処理をして、その結果を返すという機能を持った関数を作ります。
商品金額に消費税額を掛けた処理を関数として自身で作成するということです。関数の基本構文は以下の通りです。
この構文の中の引数とは関数内で使われるデータの事です。
この引数の箇所にデータを入れて関数を処理していきます。 関数名の付け方は変数名の付け方と基本的には同じですが、変数と違って関数は大文字と小文字は区別しません。
例えばdepositと言う関数とDepositと言う関数は同じ関数を意味します。
関数の中の引数は左端から第1引数、第2引数と、使う分だけ設定します。
では関数の説明をしていきます。
関数を使わないで国語、算数、英語の平均を求めるプログラムを書きますと、以下のように書くことが出来ます。 これを関数で書き換えますと以下のようになります。 実はAverage関数はこのままでは何も動きません。
この関数を使用するためには関数を呼び出す必要があります。
呼び出すことによって初めて関数が実行されます。
関数の呼び出しの基本構文は以下の通りです。
この関数の呼び出しで引数のデータを関数に渡します。
関数の呼び出し場所は以下のように関数の前でも後でも問題ありません。 もしくは
ではこのプログラムを順を追って詳しく見てみましょう。
〇で関数を呼び出します。
引数である変数にはそれぞれ56、45、99が代入されています。
〇関数を呼び出した後は$kokugonの値が$eに、$sansuuの値が$fに、$eigoの値が$gに代入されます。
実引数と仮引数の変数名が同じでなくても問題ありません。
つまり$kokugoと$e, $sansuuと$f, $eigoと$gが同じ変数名である必要はありません。
〇仮引数$e,$f,$gの部分にそれぞれ値が代入されましたが、仮引数$eはfunction内部の$eの部分に、仮引数$fはfunction内部の$fの部分に、仮引数$gはfunction内部の$gの部分に代入され計算が実行されます。
〇 function内部の処理が終わったら、呼び出し部分のに戻ります。
これで関数の実行は終わりです。
結果は以下の通りです。 では次の例をみてみましょう。 結果は以下の通りです。
会計は1333.5です
会計は1333.5です
会計は1333.5です
この例では3回関数を呼び出していますが、関数はこのように何回呼び出しても問題ありません。
次に仮引数にデフォルト引数を設定する方法について説明します。
デフォルト引数とはあらかじめ仮引数に設定する値です。
以下がデフォルト引数を使った例です。
仮引数内にと書いてありますが、これがデフォルト引数です。
デフォルト引数を1つ記述しましたので、実引数はのように1つ減らして2つでOKです。
デフォルト引数を設定する上で注意してほしいことはデフォルト引数は右端から設定していくことです。
ですので、以下の例のように左端だけ指定、他にも真ん中だけ指定、左端と真ん中だけ指定もダメです(紙面の都合でfunctionとshoppingを違う段に書いていますが通常は横一列で書いてください)。 もう一例みてみましょう。
デフォルト引数を複数設定する場合には右端から指定します。
この例では真ん中と右端の仮引数を設定しています。
またデフォルト引数を2つ設定したので、呼び出し側の実引数は1つになっています。
次は戻り値のある関数についての説明をします。
戻り値とは呼び出し元に返す値のことです。
関数の説明をする時に戻り値については以下のように説明しました。
関数とは入力したデータに基づいて決められた処理を行い、戻り値という結果を返す機能を持っています。 上の図を参考にしていただくと分かりますが、呼び出し元に値を返すにはreturnを使います。
そして、呼び出し元に戻った戻り値は変数や配列に代入されて、printなどで出力されることになります。
では例をみてみましょう。 「return $i;」の$iにはと言う値が入っていますので、この値をreturnで呼び出し元に返します。
そして、その戻り値は$qwに代入され、最終的にはで出力されます。
数値に関する関数を知ろう
この章では数値に関する関数について説明します。
round関数は第1引数で指定された値を第2引数で指定された桁数で丸めます(ほとんど四捨五入と同じですが、少しの誤差があります)。
丸める桁数を省略した場合は小数点以下を丸めます。
では例をみてみましょう。 「丸める桁数」は
「2」が小数点第2位を四捨五入
「1」が小数点第1位を四捨五入
「-2」が10の位を四捨五入
「-1」が1の位を四捨五入
です。
結果は以下の通りです。 ceil関数は指定された値を切り上げる関数です(小数点以下を切り上げて整数を取り出します)。元の数字よりも大きい数を戻り値として返します。
では例をみてみましょう。 結果は以下の通りです。
124と-123
floor関数は指定された値を小数点以下で切り捨てる関数 (端数を切り捨てる)です。
元の数字よりも小さい数を返り値として返します。
では例をみてみましょう。 結果は以下の通りです。
123と-124
number_format関数は数字を1000の位ごとにカンマで区切った文字列を戻り値として返します。
小数点以下は四捨五入されます。
小数点以下の桁数、小数点を表す区切り文字、1000の位毎の区切り文字は省略できます。
では例をみてみましょう。 $hは数値が丸められていますが、 小数点以下の桁数を指定していないため、小数点以下は表示されません。
結果はです。
次の例をみてみましょう。 2つ目の引数で小数点以下第何位まで表示するかを設定します。
この例の場合は2を指定しているので小数点第2位を四捨五入します。
結果はです
次の例をみてみましょう。 小数点を表す区切り文字に1000の位毎の区切り文字にを指定しています。
つまり、「12,345.24」のの部分がに、の部分がに変更されます。
のように引数が3つだけの指定はできませんので注意してください。
結果は以下の通りです。 mt_rand関数は乱数を生成します。
では例をみてみましょう。 結果は
1974746906
1494960676
など、毎回違う数字が表示されます。
返される値の最小値、返される値の最大値を指定しない場合には0以上の適当な値を返します。
次の例をみてみましょう。 1から800までの数字がロードするごとに変わります。
指定の範囲内で値を取得したい場合は最小値と最大値を指定します。
文字列に関する関数を知ろう
この章では文字列に関する関数について説明します。
配列の関数に続いて今度は文字列に関する関数について説明します。str_replace関数は元の文字列に関して、置換対象の文字列を置換後の文字列で置き換えます。
では例をみてみましょう。 元の文字列のカレーを牛丼に置換しています。
結果はです。
今度は元の文字列に配列を使った例を説明します。 配列の中のaをzに置換しています。
結果は以下の通りです。
z
b
c
mb_substr関数は文字列の一部分を取り出す関数です。
では例をみてみましょう。
「取り出し開始位置」は前からと数えますので、1番前から3個取り出して$kazu2に代入しています。
結果は 「123」 です。
次の例をみてみましょう。 取り出す文字数を省略すると取り出し開始位置からすべての文字列を取り出します。
取り出す文字数、文字コードは省略できます。
結果は 「5678」 です。
str_repeat関数は文字列を指定した回数だけ繰り返す関数です。
では例をみてみましょう。 繰り返す文字列にaを, 繰り返す回数に5を指定しているので、結果はになります。
explode関数は対象の文字列を区切り文字で区切った文字列を配列として返します。
では例をみてみましょう。 対象文字列$strをで分割したものを配列$arrに入れています。
配列なのでforeachで取り出すことが出来ます。
区切り文字は文字列であればでもでも何でも使うことが出来ます。
結果は「abcde」です。
implode関数は配列要素を区切り文字列により連結する関数です。
各配列の要素をでつなげているので、結果はです。
strlen関数は文字列の長さを測る関数です。
長さとはバイト数のことです。
半角英数字は1文字1バイトとして数えています。
おおよそ日本語のようなマルチバイト文字は1文字2バイトですが、文字コードがUTF-8では概ね3バイトで表されます。
つまり、バイト数は、文字コードに依存するので複雑です。
そのような理由から、日本語の文字数を数えたい場合は次に説明しますを使いましょう。
結果は以下の通りです。
21バイト
13バイト
mb_strlen関数は日本語などのマルチバイト文字列の文字数を数える関数です。
strlen関数はバイト数を習得する関数です。
文字エンコーディングは省略できます。
文字エンコーディングとはどの文字コードでこの関数を実行するのかを指定します。
では例をみてみましょう。 結果は「10個」 です。
mb_convert_kana関数は全角英数字を半角に変えたり、半角英数字を全角に変えたり、かな文字を全角カナや半角カナに変換することができます。
エンコーディングは省略できます。 では例をみてみましょう。 半角英数字を全角に変換しますので変換オプションはAを使います。
結果は以下の通りです。
「akasaka123」
次の例をみてみましょう。
では説明を始めます。
はフェラーリという全角カタカナを半角カタカナに変換してますので、結果はです。
はランボルギーニという全角カタカナを全角ひらがなに変換してますので、結果はです。
はふらのという全角ひらがなを半角カタカナに変換してますので、結果はです。
配列に関しての関数について知ろう
この章では配列に関しての関数について説明します。
関数とは入力したデータに基づいて決められた処理を行い、戻り値という結果を返す機能を持っています。
配列に関しての関数とは配列の順番を変えたりする関数のことです。
では関数の基本について説明します。 PHPの関数の仕組みはエクセルの関数の仕組みと意味は同じです。
エクセルをご存知の方はわかると思いますが、エクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。
例えば指定した範囲のデータが3,5,7であるならば結果は15です。
SUMには初めから指定した範囲の足し算を行うと言う仕組みが備わっています。
つまり、エクセルの内部機構でSUMの機能は指定した範囲の足し算を行うと言うプログラムがされていると言うことです。
これが関数の意味です。
引数とは関数内で使われるデータの事で、上の説明で言えば3,5,7の事です。
PHPには初めからこのように機能が定義されている関数が多数ありますので、この章では配列に関係する関数を取り上げたいと思います。 unshift関数は配列の1番上に要素を追加する関数です。 先頭に鹿を追加したので、では鹿が出力されます。
array_push関数は配列の1番下に要素を追加する関数です。と同じことはと書いても実現できます。
1番下に猿を追加したので、では猿が出力されます。
array_shift関数は配列の1番上から要素を削除します。 先頭から猫を削除したので、では犬が出力されます。
array_pop関数は配列の1番下から要素を削除する関数です。
末尾からネズミを削除します。
sort関数は配列の値を昇順つまり小さい値から大きい値に並び変える関数です。 sortを行ってからforeachで取り出します。
この例では数値をソートしています。
結果は 「1259」 です。
次の例をみてみましょう。 sortを行ってからforeachで取り出します。
この例では文字列をソートしています。
結果は 「bgt」 です。
次の例をみてみましょう。 =>連想配列をsortすると、添え字が0から数値で振り直されてしまうので注意が必要です。
つまりが数値に変わってしまうということです。 配列のキーと値との関係を維持しつつ、配列をソートしたい場合は後ほど説明するasort関数とarsort関数を使います。 rsort関数は配列の値を降順つまり大きい値から小さい値に並び変える関数です。 rsortを行ってからforeachで取り出します。
この例では数値をソートしています。
結果は「9521」 です。 rsortを行ってからforeachで取り出します。
この例では文字列をソートしています。
結果は「tgb」 です。 asort関数は配列のキーと値との関係を維持しつつ、配列をソートする関数です。
比較の対象は値であり、昇順に並び変えます。 arsort関数は配列のキーと値との関係を維持しつつ、配列をソートする関数です。
比較の対象は値であり、降順に並び変えます。 ksort関数は配列のキーと値との関係を維持しつつ、配列をソートする関数です。
比較の対象はキーであり、昇順に並び変えます。
krsort関数は配列のキーと値との関係を維持しつつ、配列をソートする関数です。
比較の対象はキーであり、降順に並び変えます。 array_slice関数は配列の指定した位置から要素を取得する関数です。
基本構文の中のは省略可能です。
TRUEを指定すると例え配列から要素を取り出してもキーと値の関係は崩れません。
[取り出す数]を指定しない場合は指定した位置から最後まで指定したことと同じことを意味します。
では例をみてみましょう。 この例では2つ目の要素である栄治から栄太までを切り取り、配列$name2に代入しています。
取り出し位置は0から数えているので、1の場合は2つ目の要素である栄治からになります。
結果は以下の通りです。
0=>栄治
1=>五郎
2=>栄太
次の例をみてみましょう。 開始位置がマイナス指定の場合は後ろから数えます。
この場合は「-2」なので後ろから2つ目から最後までになります。
取り出す個数を入力してないので、指定した位置から最後までになります。
つまり、終わりから2つ目の要素である五郎と栄太までを切り取り、$name2に代入しています。
結果は以下の通りです。
0=>五郎
1=>栄太
次の例をみてみましょう。 2つ目の要素である栄治から五郎までを2個切り取り、$name2に代入しています。
[取り出す数]を2に指定しているので2つ取り出しています。
結果は以下の通りです。
0=>栄治
1=>五郎
次の例をみてみましょう。 後ろから3個目の要素である栄治から五郎までを2個切り取り、$name2に代入しています。
結果は以下の通りです。
0=>栄治
1=>五郎
次の例をみてみましょう。 [取り出す数]にマイナス値を指定すると「指定した箇所」から「マイナス値で指定した箇所から右の要素」を省いたデータを取得できます。
つまりこの例で説明しますと指定した開始位置は0なので太郎から始まって、栄太、こじを省いた残りすべてを$name2に代入します。
結果は以下の通りです。
0=>太郎
1=>栄治
2=>五郎
次の例をみてみましょう。 この例のようにTRUEを指定すると取り出した要素が元の添え字のまま配列$name2に入れられます。
結果は以下の通りです。
1=>栄治
2=>五郎
次の例をみてみましょう。 array_sliceで要素を切り出しても元の配列の要素に影響しません。
の箇所で配列$name1から要素を切り出しても、配列$name1の要素が切り出される分だけなくなることはありません。
結果は以下の通りです。
0=>太郎
1=>栄治
2=>五郎
3=>栄太
array_splice関数は配列から取り出しの開始位置や取り出す個数を指定して、取り除いた配列を返します。
では例をみてみましょう。 2番目の要素から2つ取り除いて$number2に代入しています。
ここでの注目点は配列の要素を取り除くことにより元の配列まで影響を受けるということです。
それに対してでは元の配列はそのままの状態のまま影響を受けません)。
最初のprintの出力は以下の通りです。
0=>html
1=>Java
次のprintの出力は以下の通りです。
0=>PHP
1=>c++
次の例をみてみましょう。 のように取り出す数を省略すると指定した位置から最後まで取り除かれます。
最初のprintの出力は以下の通りです。
0=>html
1=>Java
2=>c++
次のprintの出力は以下の通りです。
0=>PHP
次の例をみてみましょう。 array_spliceでは配列の一部分を削除し、新しい要素で置き替えることもできます。
2番目の要素からhtmlが取り除かれてRubyが挿入されています。
最初のprintの出力は以下の通りです。
0=>html
次のprintの出力は以下の通りです。
0=>PHP
1=>Ruby
2=>Java
3=>c++
次の例をみてみましょう。 挿入する要素に配列も指定できます。
最初のprintの出力は以下の通りです。
0=>html
次のprintの出力は以下の通りです。
0=>PHP
1=>word
2=>powerpoint
3=>Java
4=>c++
配列の値を1度に複数の変数に代入することができます。
では例をみてみましょう。 $aにはPHP、$bにはhtml、$cにはJava,$dにはc++が代入されます。
結果はになります。
次の例をみてみましょう。 連想配列の場合は前の例のようにしても、うまくいきません。
その場合はlist関数とeach関数の組み合わせを使います。
each を実行して配列のキーと値のペアを順番に返してで出力します。
つまり、以下のようにnameを$aに、大野を$bに代入しを出力します。
次に以下のようにaddressを$aに、東京都を$bに代入し
を出力します。
次に以下のように年齢を$aに、34を$bに代入しを出力します。
in_array関数は配列に指定した値があるか検索し、値が見つかった場合はTRUE、見つからなかった場合はFALSEを返す関数です。
以下にin_array関数の使用例を示します。
以下の例では検索値PHPは配列$arに存在するのでin_array関数はTRUEを返します。 結果はが出力されます。
whileとifとbreakを組み合わせて使おう
この例ではwhileとifとbreakを組み合わせて使う方法について説明します。
これまではfor文の中でbreakを使っていましたが、ここではwhile文の中でbreakを使います。
では例をみてみましょう。 この例はwhile文の中にif文が入っている構造です。
①$iに1を代入します。
②($i <= 10)の条件を判定します。
$iは1でTRUEなので、whileの処理文を実行します。
③$iは1なので、if文の条件部分にはマッチしないので、そのままif文はスルーします。
④を実行してを出力します。
⑤$i++で1を足して、2になります。
⑥($i <= 10)の条件を判定します。
$iは2でTRUEなので、whileの処理文を実行します。
⑦$iは2なので、if文の条件部分にはマッチしないので、そのままif文はスルーします。
⑧を実行してを出力します。
⑨$i++で1を足して、3になります。
⑩($i <= 10)の条件を判定します。
$iは3でTRUEなので、whileの処理文を実行します。
⑪3回目のループで初めて、if文の条件式にマッチしてを実行します。
そして、breakがあるのでここでwhile文を抜けます。
結果は以下の通りです。
ループ1回
ループ2回
3回目で抜ける
forとifとbreakを組み合わせて使おう
この例ではfor文とif文とbreak文を組み合わせて使う方法について説明します。
breakは、現在実行中の for, foreach, while, do-while, switchの実行を強制終了する機能を持っています。
switch の章でbreakを使用したのを覚えているでしょうか?breakは for文でも使うことが出来るのです。
では例をみてみましょう。 for文のブロックの中にif文が入っています。
このif文の意味はもし、$iが4になったらfor文を抜けますよと言う意味です。
breakはこのように一連の流れを強制的に中止してブロックを抜けるために使われます。
$iが4になったらfor文を抜けると言うことはは出力されないということです。
結果は以下の通りです。 次の例をみてみましょう。
for文の入れ子の中でbreakを使うとどうなるのかを説明します。 この例の中のforの中でbreakを使っていますが、このbreakで抜けることができるのは内側のfor文、つまり上から2つ目のforだけです。
内側のfor文の条件部分が5を超えたら、上から2つ目のforをbreakするのですが、breakした後はまた先頭のに戻って続きを繰り返します。 になりますが、
「2掛ける3=6」
「3掛ける2=6」
「3掛ける3=9」
「4掛ける2=8」
「4掛ける3=12」
が出力されていません。
理由はif文の中のbreakで内側のfor文を抜けているために、その下のprint文が出力されていないからです。
次の例をみてみましょう。
外側のfor文も含めてすべてのfor文を抜けたい場合どうしたらいいのかを説明します。 2つfor文がありますが、すべてのfor文を抜けたい場合には内側のfor文の中にと入力します。
これにより、すべてのfor文を抜けることが出来ます。
break の横の数字には入れ子になったforの構造で抜けたい階層の数を指定します。
例えばこの例のように2つのfor文を抜けたい場合には2を指定します。
「break 3; 」と書けばforの3重構造を抜けることが出来ます。
結果は以下の通りです。
1掛ける1=1
1掛ける2=2
1掛ける3=3
2掛ける1=2
2掛ける2=4
for文で配列の要素を取り出そう
この章ではfor文による配列の要素の取り出し方について説明します。
では例をみてみましょう。 for文を使って配列の要素をループさせて、1つずつ取り出すことが出来ます。
$data[$i]の$iには0から2までの数値が順番にセットされて、出力されます。 次の例をみてみましょう。 この例は配列の要素である整数の足し算を行っています。
はと同じ意味です。
配列の要素の数だけfor文で取り出すには以下の通り、条件式にのように配列の要素数を書きますが、配列の要素の数は直接数字で書く以外に便利な方法があります。 以下のように条件式にと、記述しますと配列に含まれる要素数を取得することが出来ます。
例えば以下のようにと、書きますと、配列の要素数である3を得ることが出来ます。
for文を入れ子にしよう
この章ではfor文の応用でfor文のネストについて説明します。
ネストとはfor文の中にfor文を入れると言うことです。
では例をみてみましょう。 for文のネストは複雑なので順を追って説明します。
①$iに1を代入します。
②「$i<=3」の条件式を判定しますがここがTRUEなので が3回実行されて
1掛ける1=1
1掛ける2=2
1掛ける3=3
と出力されます。
つまり、最初は$iには1が入っているので、print文の中の$iには1が入ります。
には1から3までが、順番に代入されます。
つまり、外側のfor文が1周するごとに、中のfor文は3周しています。 ③次に$i++の箇所で$iに1を足し、$iは2になります。
④そして条件式の判定に入りますが、2回目のループではまだ$iは2なのでTRUEということになり、 が3回実行されて
2掛ける1=2
2掛ける2=4
2掛ける3=6
と出力されます。
⑤次に$i++に戻り$iに1を足します。
そこで$iは3になります。
⑥そして条件式の判定に入りますが、3回目のループではまだ$iは3なので,TRUEということになり、 が3回実行されて
3掛ける1=3
3掛ける2=6
3掛ける3=9
と出力されます。
⑦次に$i++に戻り$iに1を足します。
そこで$iは4になります。
⑧そして条件式の判定に入りますが、$iは4で3以下ではないのでFALSEとなり、ここでループは終わりになります。