PHP / Ope / 配列操作

PHP / Ope / 配列操作

配列と連想配列

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);

foreach 中の配列に要素追加した場合の foreach の挙動

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"]);

配列要素数を知る

countという配列要素数を数える関数があるのでこいつで数える

$hoge = array(1, 2, 3);
echo count($hoge);

配列同士の結合

配列同士の結合(非破壊的)

$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"]);

NULL の要素を削除する

こうする。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の配列はオブジェクトではなく、挙動も変で使い勝手悪いのでそれを正すようなラッパーが各フレームワークに搭載されているので使用を検討するとヨイ

タグ

php/ope/array_ope/start.txt · 最終更新: 2021-06-23 16:58 by ore