【PHP】array_push()の使い方 - 配列の要素を追加する
-
カテゴリ:
- PHP
PHPをお使いの方はお馴染みかもしれませんが、配列に要素を追加する時によく使われているのがこの「array_push関数」です。
簡単に使えるため重宝するのですが、その反面細かい調整が必要な処理を組む場合、どのように動くか正確に把握しずらいため、扱いづらさを感じる時がありました。
そのため、array_push関数にいろいろなパターンの変数をぶち込んでみて、どのような処理結果になるかいろいろ検証してみたので、そのメモを残しておきます。
主に気になること・検証したいことは以下の通りです。
- 追加されるキーは順番に発番されるのか
(途中で別の配列をpushしても大丈夫か) - 入れる配列のデータ型は意識しなくてもいいのか
- 連想配列と通常の配列を混ぜて入れれるのか
今回のPHPのバージョンはPHP 5.6.25です。ただPHP 4系, PHP 5系, PHP 7系のバージョンなら問題なく動くかと思います。。。
使い方
まずは簡単にarray_push関数の使い方を説明します。
int 追加した配列数 = array_push ( $配列名 $値1 [, $値2 $... ] )
引数として、
第一引数: 値を追加数配列を指定します。追加後子の配列名はそのまま使えます。
第二引数以降:追加する値をカンマ区切りで指定します。複数指定可能です。
戻り値: 追加した配列数が返ってくること注意してください。
※追加した配列が返ってくるわけではありません。
サンプル
実際に使い方を理解するために、サンプルソースを見ていきましょう。
値を追加するサンプル
サンプル1は一番シンプルな例で、単純に配列に値を複数追加するサンプルになります。
サンプル1
echo "sample1 ------------------------\r\n";
$list = array();
var_dump($list);
array_push($list, 1);
var_dump($list);
array_push($list, 2, 3);
var_dump($list);
サンプル1結果
sample1 ------------------------
array(0) {
}
array(1) {
[0] => int(1)
}
array(3) {
[0] => int(1)
[1] => int(2)
[2] => int(3)
}
最初に数値の1を一つ追加し、次に連続して数値の2と3を追加しています。キー値も順番に発番されているかと思います。
データ型の異なる値を追加するサンプル
サンプル2ではいろいろなデータ型の値を追加しているサンプルになります。
サンプル2
echo "sample2 ------------------------\r\n";
$list = array();
array_push($list, "fujita", 1, "2", false);
var_dump($list);
サンプル2結果
sample2 ------------------------
array(4) {
[0] => string(6) "fujita"
[1] => int(1)
[2] => string(1) "2"
[3] => bool(false)
}
文字列型、数値型、ブーリアン型の順で正常に追加できています。追加する値について特別データ型を意識する必要はなさそうですね。
配列キーの発番の仕方を検証するサンプル
arrya_pushするたびにちゃんと配列のキーが順番通りに発番されるのか検証してみました。
サンプル3では2つの配列を用意して、追加する順番をランダムで追加してそれぞれの配列のキーが昇順に発番されているか検証します。
サンプル3
echo "sample3 ------------------------\r\n";
$list_1 = array();
$list_2 = array();
array_push($list_1, 0);
array_push($list_1, 1);
array_push($list_1, 2);
array_push($list_2, 0);
array_push($list_1, 3);
array_push($list_2, 1);
array_push($list_2, 2);
array_push($list_2, 3);
array_push($list_1, 4);
array_push($list_2, 4);
echo '$list_1:\r\n';
var_dump($list_1);
echo '\r\n';
echo '$list_2:\r\n';
var_dump($list_2);
サンプル3結果
sample3 ------------------------
$list_1:
array(5) {
[0] => int(0)
[1] => int(1)
[2] => int(2)
[3] => int(3)
[4] => int(4)
}
$list_2:
array(5) {
[0] => int(0)
[1] => int(1)
[2] => int(2)
[3] => int(3)
[4] => int(4)
}
結果として、同一の配列に対してarray_push関数で追加した分、キーが昇順で発番されていることがわかるかと思います。
配列ごとちゃんとキー値が区別されて発番されているので、これで安心してfor文などに組み込んで使えます。
連想配列に配列を追加するサンプル
今までは通常の配列について検証してきましたが、連想配列が混じった場合はどうなるのか、検証したいと思います。
サンプル4は既存の連想配列に対して数値を追加するサンプルになります。
連想配列とは要はキー値が文字列の配列のことで、キー値が数値と文字列の両方が含まれる配列に対してarray_pushした際に、ちゃんとキーが発番され手追加されるかが一番確認したいポイントとなります。
連想配列において以下のようなパターンを用意しました。
$list: 要素数1の連想配列
確認ポイント ⇒ 要素が「0」の配列が追加されるか
$list_1:3つある要素のうち2つ目のキー値が文字列のパターン
確認ポイント ⇒ 最後尾の配列に追加する形で、要素が「2」の配列が追加されるか
$list_2:数値のキーと文字列のキーが2つずつ存在し、最後のキー値が文字列のパターン
確認ポイント ⇒ 要素が「1」の配列が追加されるか
$list_3:数値のキー1つと文字列のキーが2つ存在し、最後のキー値が数値文字のパターン
確認ポイント ⇒ 最後尾の配列の要素「"7"」に追加される形で、要素「8」の配列が追加されるか
サンプル4
echo "sample4 既存の連想配列に配列を追加------------------------\r\n";
echo '$list:\r\n';
$list = array("test1" => 1);
array_push($list, 2);
var_dump($list);
echo '\r\n';
echo '$list1:\r\n';
$list_1 = array(0, "test1" => 1, 2);
array_push($list_1, 3);
var_dump($list_1);
echo '\r\n';
echo '$list2:\r\n';
$list_2 = array(0, "test2" => 1, 2, "test3" => 3);
array_push($list_2, 4);
var_dump($list_2);
echo '\r\n';
echo '$list3:\r\n';
$list_3 = array(0, "test3" => 1, "7" => 2);
array_push($list_3, 3);
var_dump($list_3);
サンプル4結果
sample4 既存の連想配列に配列を追加------------------------
$list:
array(2) {
["test1"] => int(1)
[0] => int(2)
}
$list1:
array(4) {
[0] => int(0)
["test1"] => int(1)
[1] => int(2)
[2] => int(3)
}
$list2:
array(5) {
[0] => int(0)
["test2"] => int(1)
[1] => int(2)
["test3"] => int(3)
[2] => int(4)
}
$list3:
array(4) {
[0] => int(0)
["test3"] => int(1)
[7] => int(2)
[8] => int(3)
}
結果から言うと、4パターンとも想定通りの結果になりました。
$listに関しては配列が正常に追加されているし、$list_1は最後尾の配列が「[1]=>2」であるため、array_push関数で追加された結果は、キー値「2」の配列が正常に追加されています。
$list_2の配列は三番目の配列のキー値が「1」で最後尾は「”test3"」です。array_push関数で追加すると三番目の配列のキー値に対してプラス1される形で発番されています。途中に文字列のキーが含まれていても、数値のキー値のみで発番されていることが分かりました。
$list_3では、キーの順番は0からいきなり7に飛ぶ形で構成されており、しかも数値文字で設定されています。結果としてはキーの数値が飛んでいたとしても最大の値に対して発番され、さらに数値文字でも数値として扱ってくれるようです。
通常の配列に対して連想配列を追加するパターン
サンプル4とは逆に、サンプル5では既存の通常配列に対して連想配列を追加してみます。
サンプル5
// 5
$list_1 = array();
echo "sample5 既存の配列に連想配列を追加------------------------\r\n";
echo "[$list]:\r\n";
$list = array(0);
array_push($list, array("test1" => 1));
var_dump($list);
// 以下結果は一緒
// $list_1["test1"] = 1;
// array_push($list, $list_1);
//
// array_push($listi, ["test1" => 1]);
// 実際に連想配列を追加したいなら
echo "[$list_1]:\r\n";
$list_1 = array(0);
$list_1 = array_merge($list_1, array("test1" => 1));
var_dump($list_1);
$list_1 = $list_1 + array("test2" => 2);
var_dump($list_1);
サンプル5結果
sample5 既存の配列に連想配列を追加------------------------
[$list]:
array(2) {
[0] => int(0)
[1] =>
array(1) {
["test1"] => int(1)
}
}
[$list_1]:
array(2) {
[0] => int(0)
["test1"] => int(1)
}
array(3) {
[0] => int(0)
["test1"] => int(1)
["test2"] => int(2)
}
配列に対して連想配列をarray_push関数で素直に追加すると、$listのように階層は1階層深くなってしまいました。
同じ階層で連想配列を追加するためには、$list_1の例の通りarray_merage関数を使うことでうまくいきます。
追加⇒削除⇒追加するパターン
最後の検証パターンとして、配列の要素を削除した後に追加した場合どうなるか、検証してみました。
サンプル6
echo "sample6 ------------------------\r\n";
// 追加⇒ 削除⇒ 追加
$list = array(0, 1, 2);
array_push($list, 3);
var_dump($list);
unset($list[3]);
var_dump($list);
array_push($list, 3);
var_dump($list);
$list_1 = array(0, 1, 2);
array_push($list_1, 3);
var_dump($list_1);
unset($list_1[1]);
var_dump($list_1);
array_push($list_1, 3);
var_dump($list_1);
サンプル6結果
sample6------------------------
// $list:配列追加時
array(4) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
[3]=> int(3)
}
// $list:配列削除時
array(3) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
}
// $list:配列再追加時
array(4) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
[4]=> int(3)
}
// $list_1:配列追加時
array(4) {
[0]=> int(0)
[1]=> int(1)
[2]=> int(2)
[3]=> int(3)
}
// $list_1:配列削除時
array(3) {
[0]=> int(0)
[2]=> int(2)
[3]=> int(3)
}
// $list_1]:配列再追加時
array(4) {
[0]=> int(0)
[2]=> int(2)
[3]=> int(3)
[4]=> int(3)
}
$listの例は配列の最後尾を削除しているのに対し、$list_1では途中の要素を削除しています。
結果としてはどちらも同じ結果で、プラス1されたキー値が発番されるようです。
array_pushu関数を使う際の注意点
array_push関数を使う上で注意したいことは、実行結果として追加した配列の実態を返すのではなく、追加した配列の数を返すということです。
サンプル7
echo "サンプル7 ------------------------\r\n";
$list = array();
var_dump($list);
array_push($list, 1);
var_dump($list);
$list = array_push($list, 2, 3);
var_dump($list);
?>
サンプル7結果
サンプル7 ------------------------
array(0) {}
array(1) {
[0]=> int(1)
}
int(3) //←※配列の実態ではなく、配列の個数が返ってきている
そのままarray_push関数を使っていれば引数に渡した配列に再帰的に変数が追加されますが、array_pushの結果をもとの配列に代入してしまうと、追加した数がそのまま代入され元の配列の値は消えてしまうので、注意しましょう
まとめ
今回、array_push関数に関して、掘り下げて動きを細かく検証しました。
おおむね自分の予想通りの動きをしてくれました。
これで安心してarray_push関数を使えます!^^。