[2024/07/03] 【PHP】配列の中に参照変数を持つことで別々の変数の要素を操作する (No.363)
[2024/07/03] 【PHP】関数の戻り値を複数にする方法(list関数) (No.362)
[2024/07/03] 【PHP】関数の戻り値を複数にする方法(list関数) (No.361)
[2024/07/03] 【PHP】関数の引数に複数のデフォルト値を設定した場合の注意点について (No.360)
[2024/07/02] 【PHP】「stdClass」を関数の引数としての使い方について (No.359)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
PHPでのプログラムでは変数の参照を扱う場合には、変数の先頭に & を付けます。 配列の要素を操作する場合には以下の様に、配列の中身を受ける変数の先頭に & を付けて処理します。
以下の例では、数値配列を設定し、配列内の要素の値を10倍しています。
<?php //配列宣言 $arrData0 = array(1, 2, 3); var_dump($arrData0); //配列の値を「$arrValue」で受ける foreach ($arrData0 as &$arrValue) { //値を10倍する $arrValue *= 10; } //最後の要素の参照を解放 unset($arrValue); //内容の表示 var_dump($arrData0); ?>
結果は以下の表示になります。array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } array(3) { [0]=> int(10) [1]=> int(20) [2]=> int(30) }
配列の全ての要素が10倍されていることが分かります。
ここで、別々の変数の参照を配列に持ち処理する方法を示します。<?php //3個の変数を宣言 $data1 = 1; $data2 = 2; $data3 = 3; //3個の変数を二重配列にして参照配列の宣言 $arrData = array( array( &$data1 ) , array( &$data2 ) , array( &$data3 ) ); //二重配列のループ処理で各変数の値を10倍する foreach ($arrData as $arrValue) { $arrValue[0] *= 10; } //内容の表示 var_dump($arrData); var_dump($data1); var_dump($data2); var_dump($data3); ?>
この結果は以下の様に、3個の変数の値がそれぞれ10倍されたことが分かります。
array(3) { [0]=> array(1) { [0]=> &int(10) } [1]=> array(1) { [0]=> &int(20) } [2]=> array(1) { [0]=> &int(30) } } int(10) int(20) int(30)
PR -
今回はPHPのプログラムを組んでいて、 関数array_keysを利用して配列のキーの中に、指定されたキーの存在チェックを行う為に 使っていたのですが、指定されたキーが無かった場合はどうなるのかなと思い、調べてみました。
PHPの公式のマニアルには以下の様な例が載っています。<?php $array = array(0 => 100, "color" => "red"); print_r(array_keys($array)); $array = array("blue", "red", "green", "blue", "blue"); print_r(array_keys($array, "blue")); $array = array("color" => array("blue", "red", "green"), "size" => array("small", "medium", "large")); print_r(array_keys($array)); ?>
これを実行すると以下の様になります。
Array ( [0] => 0 [1] => color ) Array ( [0] => 0 [1] => 3 [2] => 4 ) Array ( [0] => color [1] => size )
確かにこれで例としては問題無いのですが、結果としてキー値が返るものしか載っていません。 まあ、該当しないキー値を指定した場合は自分で調べればいいのですが。 そこで、2番目の例で、キーが存在しない yellow でやってみました。
<?php $array = array("blue", "red", "green", "blue", "blue"); print_r(array_keys($array, "yellow")); ?>
この結果は、以下の様になります。
Array ( )
結果としては、空のarrayが返ります。 この結果に対して、count()を取ってやれば、0となります。 また、foreachで処理しても結果の配列は空なので、以下の様に処理されないことになります。
<?php $array = array("blue", "red", "green", "blue", "blue"); /* array_keys:配列内にデータが存在 */ foreach (array_keys($array, "blue") as $arrValue) { echo "KEY=".$arrValue."\n"; } /* array_keys:空の配列が返る */ foreach (array_keys($array, "yellow") as $arrValue) { echo "KEY=".$arrValue."\n"; } ?>
PHPのマニアルも空の配列の例が載っていると助かるのですが・・・
-
他の言語では難しいのですが、PHPでは関数の戻り値を配列(array)で行い、 結果をlist関数で受けることにより複数の戻り値の様になります。
先ずは、list関数についてみてみます。 以下のソースを見て下さい。<?php $arr = array( "111", "222", "333"); list($d1, $d2, $d3) = $arr; echo $d1.",".$d2.",".$d3; ?>
結果は、変数 $d1, $d2, $d3 に配列のそれぞれの値が順番に入るので以下の表示になります。111,222,333
これを参考にして関数の戻り値を複数にしてみます。<?php //配列での戻り値のテスト関数 function getTest(){ $arr = array( "111", "222", "333"); return $arr; } //戻り値が配列の関数から値の取得 list($ret1, $ret2, $ret3) = getTest(); echo $ret1.','.$ret2.','.$ret3; ?>
関数の戻り値を list関数で受けることで、3個の変数にばらすことができます。
(この結果の表示は先ほどのものと同様です。)
そこで、関数を少し複雑にして、戻り値を1個の数値データと、配列データを戻してみます。<?php //配列での戻り値のテスト関数 function getTest(){ $arr = array( "111", "222", "333"); $cnt = count($arr); return array($cnt, $arr); } //戻り値が配列の関数から値の取得 list($retc, $retarr) = getTest(); echo "<pre>"; print_r($retc); echo "<br />"; print_r($retarr); echo "</pre>"; ?>
関数の中身は、配列データを入れ子にして戻り値にしています。配列の中身がさらに配列でも入れられるのでこの様なことができます。
データベースから一連のデータを取得する場合に、データ件数とそのレコードデータを返す場合に使えると思います。
上のソースの結果は以下の様になります。3 Array ( [0] => 111 [1] => 222 [2] => 333 )
-
PHP では引数を複数持つユーザー関数の定義は以下の様になります。
<?php // 一般的な引数が3個ある関数 function func1($P1, $P2, $P3) { // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1", "22", "333"); // 表示結果 ⇒ func1:122333 ?>
関数自体は特に意味がある内容ではありませんが、引数を文字列として連結して返します。
ここでこの第2引数以降をデフォルト値を持つ様にします。 デフォルト設定は、引数の右側にイコール文字を置き、その後にデフォルト値を書きます。 (第2引数以降は全てデフォルト値を持つ必要があります。)
<?php // 2個の引数がデフォルト値がある関数 function func1($P1, $P2 = "AA", $P3 = "BBB") { // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1"); // 表示結果 ⇒ func1:1AABBB ?>
結果表示をコメントで記していますが、デフォルト値が表示されるはずです。
もし、第2引数のみデフォルト値としたい場合に以下の様にしたのですが、PHPのエラーが発生しました。<?php // 2個の引数がデフォルト値がある関数 function func1($P1, $P2 = "AA", $P3 = "BBB") { // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1", , "CCC"); ?>
"func1:1AACCC"の表示を期待したのですが、以下のエラーが発生しました。 第2引数を省略する場合は、第3引数も省略が必要な様です。Parse error: syntax error, unexpected ',' in ******/test-func.php on line 8
そこで第2、第3引数に NULL が指定された場合にはデフォルト値を設定する様にしてみました。 (これだと普通の関数になってしまいました)<?php // 2個の引数がデフォルト値がある関数 function func1($P1, $P2 = "AA", $P3 = "BBB") { if (empty($P2)) { $P2 = "AA"; } if (empty($P3)) { $P3 = "BBB"; } // 引数を単に文字列化して連結 return "" . $P1 . $P2 . $P3; } echo "func1:" . func1("1") . "<br />"; echo "func1:" . func1("1", NULL, "CCC") . "<br />"; echo "func1:" . func1("1", "222") . "<br />"; // 表示結果 // func1:1AABBB // func1:1AACCC // func1:1222BBB ?>
-
以前 stdClass の使い方を以下の記事に記しましたが、今回はそれを関数の引数に使おうと思います。
⇒【PHP】連想配列の様な「stdClass」の使い方について
stdClass を引数にする場合には、どの様なプロパティを設定するのかは、前もって関数の呼び出し側と、関数内の処理を決めておく必要があります。
但し、引数が非常に多くなる場合には stdClass で渡すことですっきりした関数呼び出しにはなると思います。
以下のソースは stdClass を生成し3個のプロパティへを設定し、その内容を表示する簡単な例です。
<?php //[stdClass]が引数の関数宣言 function funcStd(stdClass $cls) { echo "stdVal1=[$cls->stdVal1]<br />"; echo "stdVal2=[$cls->stdVal2]<br />"; echo "stdVal3=[$cls->stdVal3]<br />"; } //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; $stdObj->stdVal3 = "3333"; //関数の実行(データ表示) funcStd($stdObj); ?>
3個のプロパティ値が表示されることが確認できます。stdVal1=[1111] stdVal2=[2222] stdVal3=[3333]
さらにもう一つの関数を宣言します。 この関数は、同じ引数を持つのですが各プロパティを再設定する様にしています。
<?php //[stdClass]が引数の関数宣言 function funcStd(stdClass $cls) { echo "stdVal1=[$cls->stdVal1]<br />"; echo "stdVal2=[$cls->stdVal2]<br />"; echo "stdVal3=[$cls->stdVal3]<br />"; } //[stdClass]の内容を変更する関数宣言 function funcStdUpd(stdClass $cls) { $cls->stdVal1 *= 10; $cls->stdVal2 = $cls->stdVal2 . "AAA"; $cls->stdVal3 = $cls->stdVal3 . "BBB"; } //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; $stdObj->stdVal3 = "3333"; //関数の実行(データ表示) funcStd($stdObj); //[stdClass]の内容を変更 funcStdUpd($stdObj); //関数の実行(データ表示) funcStd($stdObj); ?>
これを実行すると以下の様な結果になります。stdVal1=[1111] stdVal2=[2222] stdVal3=[3333] stdVal1=[11110] stdVal2=[2222AAA] stdVal3=[3333BBB]
関数の引数としてクラスを渡すと、参照渡しで行われる様です。 参照渡しのため、クラスプロパティの値を書き換えることが出来ますので、注意が必要です。
また、 stdClass にプロパティが存在するかどうかをチェックし、処理を分けることも可能です。 上のソースに4番目のプロパティの存在有無で処理を分ける様にする処理を付加したものを以下に示します。<?php //[stdClass]が引数の関数宣言 function funcStd(stdClass $cls) { echo "stdVal1=[$cls->stdVal1]<br />"; echo "stdVal2=[$cls->stdVal2]<br />"; echo "stdVal3=[$cls->stdVal3]<br />"; if(isset($cls->stdVal4)) { echo "stdVal4=[$cls->stdVal4]<br />"; } } //[stdClass]の内容を変更する関数宣言 function funcStdUpd(stdClass $cls) { $cls->stdVal1 *= 10; $cls->stdVal2 = $cls->stdVal2 . "AAA"; $cls->stdVal3 = $cls->stdVal3 . "BBB"; if(isset($cls->stdVal4)) { $cls->stdVal4 = $cls->stdVal4 . "CCC"; } } //[stdClass]の生成 $stdObj = new stdClass; $stdObj->stdVal1 = 1111; $stdObj->stdVal2 = "2222"; $stdObj->stdVal3 = "3333"; //関数の実行(データ表示) funcStd($stdObj); //[stdClass]の内容を変更 $stdObj->stdVal4 = "4444"; funcStdUpd($stdObj); //関数の実行(データ表示) funcStd($stdObj); ?>
これを実行すると以下の様な結果になります。stdVal1=[1111] stdVal2=[2222] stdVal3=[3333] stdVal1=[11110] stdVal2=[2222AAA] stdVal3=[3333BBB] stdVal4=[4444CCC]