-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
json_decode を使っていた時に JSON としては問題無いのではと思っていたものが、 結果として NULL が返ってきていました。
PHP のソースとしては以下の様な感じです。<?php $strJson = file_get_contents('test.json'); $arrData = json_decode($strJson, true); // この $arrData がNULLになる ?>
test.json の内容は以下です。{ records: [ { id: 1, data1: "aaaaa", data2: "111" }, { id: 2, data1: "bbb" , data2: "2222"}, { id: 3, data1: "cccc" , data2: "333" } ] }
データの見た目は特に問題無い様なのですが、上手くいかなかったので PHP のマニュアルにあたってみると、 要素名はダブルクォートで囲まないと json_decode の結果が NULL で返ることが載っていました。 早速、要素名をダブルクォートで囲んでみました。{ "records": [ { "id": 1, "data1": "aaaaa", "data2": "111" }, { "id": 2, "data1": "bbb" , "data2": "2222"}, { "id": 3, "data1": "cccc" , "data2": "333" } ] }
json_decode の結果として records の配列が返ってきました。
やはり何かおかしい動きが在ったら先ず正式なドキュメントを見ることですね。 (私自身の戒めですが)
PR -
PHPでは変数に関数名を設定し、その変数の後に括弧(())を付けることで、変数に設定された関数を実行します。 これは、似た様な関数を作成した時に、何かの条件で関数の実行振り分ける時に使えるかと思います。
以下の例では、2個の関数を宣言し、関数名の配列を宣言し、繰り返し処理でそれぞれの関数を実行しています。
<?php //最初の関数宣言 function func1() { echo "func1......<br>"; } //2番目の関数宣言 function func2() { echo "func2******<br>"; } //関数名を配列に設定 $arr = array("func1", "func2"); //配列を順次処理する foreach ($arr as $strFuncName) { //関数を実行 $strFuncName(); } ?>
結果は以下の表示になります。func1...... func2******
それぞれの関数が実行されたことが分かります。
可変関数の方法をクラスにも適用できます。 可変関数の様に別名のクラスを用意し、同じメソッドを持たせてみます。<?php //最初のクラス宣言(メソッド1個のみ) class test1 { function hello() { echo "test1 : hello<br>"; } } //2番目のクラス宣言 class test2 { function hello() { echo "test2 : hello<br>"; } } //クラス名を配列に設定 $arrClass = array("test1", "test2"); //配列を順次処理する foreach ($arrClass as $strClassName) { //クラス生成 $test = new $strClassName; //メソッド呼び出し $test->hello(); //クラスのインスタンス廃棄 unset($test); } ?>
この結果は以下の様に、クラスが順次生成され、「hello」メソッドが呼び出されることが分かります。
test1 : hello test2 : hello
-
最近、PHPでのプログラムを組む上で、配列の代入の動作がどうだったか少し心配になったので調べてみました。
配列の代入は、代入元の配列の内容そのものが全てコピーされます。他の言語では代入元のクローンを作成し、 代入先の配列に設定する感じです。
以下のソースは代入を行う簡単な例です。<?php //最初の配列宣言 $arr1 = array("AAAAA", "BBBB", "CCC"); //配列のコピー $arr2 = $arr1; //敢えてコピー先配列の2番目のデータ書き換え $arr2[1] = intval(1); //内容の表示 print_r($arr1); print_r($arr2); ?>
結果は以下の表示になります。Array ( [0] => AAAAA [1] => BBBB [2] => CCC ) Array ( [0] => AAAAA [1] => 1 [2] => CCC )
コピー先の配列の内容が、コピー元の内容と異なっていることが分かります。
但し、代入の所で「&」を使用すると、内容がコピーされるのではなく、参照がコピーされます。<?php //最初の配列宣言 $arr1 = array("AAAAA", "BBBB", "CCC"); //配列の参照コピー $arr2 = &$arr1; //$arr2を介して,$arr1が変更 $arr2[1] = intval(1); print_r($arr1); print_r($arr2); ?>
この結果は以下の様に、2個の配列の内容が同じになります。
Array ( [0] => AAAAA [1] => 1 [2] => CCC ) Array ( [0] => AAAAA [1] => 1 [2] => CCC )
-
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)
-
今回は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のマニアルも空の配列の例が載っていると助かるのですが・・・