menu
書いてる野郎
orebike@gmail.com
PHP のプログラミングとは基本的にこの配列を foreach で回すことである(嘘)
PHP の配列と連想配列は基本的に同じモノで、配列は数値をキーにした連想配列と考えればよい。
PHP の場合は配列の代入で配列がコピーされる。 当然関数に配列を渡した場合も、参照渡しにならずコピーが渡される。
一部のプログラマーがこの性質を知った上で妙なコードを書くので注意が必要である。
$hoge = array(1, 2, 3); $hoge[] = 4;
array_mergeを利用して
$hoge = array(1, 2, 3); $piyo = array_merge($hoge, array(4));
array_unshift関数を使って
$hoge = array(1, 2, 3); array_unshift($hoge, 0);
PHP の配列に対しての foreach 走査をして、その配列自身を foreach 内で書き換えた場合どうなるか?
結果として、最初の状態がそのままループされて、配列の変更はループの挙動に影響を与えない。
つまり、ループ中に要素追加したとしてもループ回数が増えるわけではない
ループ中にその値を書き換えたとしても、それも反映されない
多分そういう動きをする。紛らわしいのでこのような操作はしないほうがよい。
PHPにはあまり区別がない
$hoge = array("piyokey" => "piyoval", "fugakey" => "fugaval");
追加したいキーを指定して代入すればよい
$hoge = array("hoge" => "ほげ"); $hoge['piyo'] = "ぴよ";
PHPの連想配列は特殊な書き方でキーの存在を確認してキーが存在しなかったら値を突っ込むということができる
この例では「hoge」という同一キーを使っているのだが先に指定されているためあとで「+=」で結合したほうは採用されない。
$hoge = array("hoge" => "ほげ"); $hoge += array("hoge" => "ホゲ"); echo $hoge["hoge"]; #=> "ほげ"
この場合は採用される。
$hoge = array("piyo" => "ぴよ"); $hoge += array("hoge" => "ホゲ"); echo $hoge["hoge"]; #=> "ホゲ"
CakePHPで設定のデフォルト値を後入れする場合とかにこのような記述が使われていた。
対象のキーを指定して unset で削除する。
unset($hoge["piyo"]);
$a3 = array_merge($a1, $a2);
PHP の配列の並びの特徴としては、配列要素にアクセスするためのインデックスと内部的な並び順というのが独立して存在しているということがある。
PHP は配列の順とインデックス順が一致しないので、インデックス順が重要な処理の前にはこれを一致させたほうがよい
ksort($hoge);
shuffleという配列操作関数を使うんだけど、この関数で注意するところは、配列を破壊的にランダム化することと、戻り値がシャッフルされた配列ではないこと
shuffle($hoge);
array_reverse関数を使うと配列を非破壊的に逆順ソートして戻してくれる。
$a = array(1, 2, 3, 4); $b = array_reverse($a);
$hoge = array_unique(array(1, 2, 2, 3));
in_arrayというメソッドで配列中の要素を検索できる。合致する要素があった場合「true」をリターンする。合致しなかった場合は「false」をリターンする
if(in_array(1, array(1, 2, 3))){ echo "あった"; }
注意としては内部では「==」演算子で比較しているようでnullとかゼロとかが同じものとして検出されてしまう。こういう部分の厳密比較がしたい場合は第三引数に厳密スイッチがあるのでこいつをオンにする。
if(in_array(null, array(0, 2, 3)), true){ echo "あった"; }
使い方としては、単純で型均一な配列から同一型の要素を検索する用途にしか使わないほうがいいだろう。
PHPの配列は == 演算子で比較することができる。 この場合各要素を == で比較するということになる。当然順序や数は合っていないといけない
型も含めた厳密な一致は === 演算子で確認する。
implode というメソッドを使うが、こいつは別名で join という関数が定義されているので、こっちのほうがわかりやすい
implode(',', ["a", "b", "c"]); join(',', ["a", "b", "c"]);
こうする。array_filter を第二引数無しに実行すると false と判定される値が削除される。 values は何をしているかというと、配列の再生成を行っている。こうすることで並び順とインデックスが一致する。 これをやらないと削除した部分だけ歯抜けになる。
$a = array("a", "b", NULL, "c"); $a = array_values(array_filter($a));
array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
PHPの配列はオブジェクトではなく、挙動も変で使い勝手悪いのでそれを正すようなラッパーが各フレームワークに搭載されているので使用を検討するとヨイ