array_push() / array_pop() / array_shift() / array_unshift()
| 対応: | PHP 4(2000) |
|---|
配列の末尾や先頭に要素を追加・削除する関数です。スタックやキューのようなデータ操作を行う際に使います。
構文
// 配列の末尾に要素を追加 array_push(配列, 値1, 値2, ...); // 配列の末尾から要素を取り出す array_pop(配列); // 配列の先頭から要素を取り出す array_shift(配列); // 配列の先頭に要素を追加 array_unshift(配列, 値1, 値2, ...);
関数一覧
| 関数 | 概要 |
|---|---|
| array_push($array, $value, ...) | 配列の末尾に1つ以上の要素を追加します。追加後の配列の要素数を返します。 |
| array_pop($array) | 配列の末尾から要素を1つ取り出して返します。配列は短くなります。 |
| array_shift($array) | 配列の先頭から要素を1つ取り出して返します。残りの要素のインデックスは振り直されます。 |
| array_unshift($array, $value, ...) | 配列の先頭に1つ以上の要素を追加します。追加後の配列の要素数を返します。 |
サンプルコード
sample_array_push.php
<?php $items = ['item_a', 'item_b', 'item_c']; // 末尾に要素を追加 array_push($items, 'item_d', 'item_e'); print_r($items); // 末尾から要素を取り出す $last = array_pop($items); echo $last . "\n"; // 先頭から要素を取り出す $first = array_shift($items); echo $first . "\n"; // 先頭に要素を追加 array_unshift($items, 'item_f', 'item_g'); print_r($items); // $items[] でも末尾に追加できる $items[] = 'item_h'; print_r($items);
実行すると次のように出力されます。
php sample_array_push.php
Array
(
[0] => item_a
[1] => item_b
[2] => item_c
[3] => item_d
[4] => item_e
)
item_e
item_a
Array
(
[0] => item_f
[1] => item_g
[2] => item_b
[3] => item_c
[4] => item_d
)
Array
(
[0] => item_f
[1] => item_g
[2] => item_b
[3] => item_c
[4] => item_d
[5] => item_h
)
概要
『array_push()』と『array_pop()』は配列の末尾を操作し、『array_unshift()』と『array_shift()』は先頭を操作します。これらを組み合わせることで、スタックやキューの動作を実現できます。
要素を1つだけ末尾に追加する場合は、『$array[] = $value;』の記法のほうがシンプルで高速です。『array_push()』は複数の値を一度に追加したい場合に使われます。
『array_shift()』を実行すると、残りの数値キーはゼロから振り直されます。文字列キーはそのまま維持されるため、連想配列に対して使用する場合はキーの変化に留意が必要です。配列の任意の位置を操作したい場合は『array_splice()』を活用できます。
array_shiftは数値キーを振り直す
『array_shift()』を実行すると、残りの要素の数値キーが0から振り直されます。文字列キーはそのまま保持されます。数値キーのインデックスに依存した処理を行っている場合、意図しない動作をする可能性があります。
sample.php
<?php $queue = ['item_a', 'item_b', 'item_c', 'item_d']; echo "処理前: "; print_r(array_keys($queue)); $first = array_shift($queue); echo "取り出し: " . $first . "\n"; echo "処理後: "; print_r(array_keys($queue));
実行すると次のように出力されます。
php sample.php
処理前: Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
)
取り出し: item_a
処理後: Array
(
[0] => 0
[1] => 1
[2] => 2
)
文字列キーの連想配列では、キーは保持されます。
sample_02.php
<?php $assoc = ['key_x' => 'item_a', 'key_y' => 'item_b', 'key_z' => 'item_c']; $first = array_shift($assoc); echo "取り出し: " . $first . "\n"; print_r($assoc);
実行すると次のように出力されます。
php sample_02.php
取り出し: item_a
Array
(
[key_y] => item_b
[key_z] => item_c
)
array_pushより$array[] =が高速
要素を1つ追加するだけなら、『$array[] = $value』の記法が関数呼び出しのオーバーヘッドがない分高速です。『array_push()』は複数の値を一度に追加したい場合に使われます。
sample_03.php
<?php $log = []; // array_push で追加 array_push($log, 'task_1 started'); // $array[] で追加(1要素の追加ならこちらが高速) $log[] = 'task_2 started'; print_r($log); // 複数要素を一度に追加したい場合は array_push が便利 array_push($log, 'task_3 started', 'task_4 started'); print_r($log);
実行すると次のように出力されます。
php sample_03.php
Array
(
[0] => task_1 started
[1] => task_2 started
)
Array
(
[0] => task_1 started
[1] => task_2 started
[2] => task_3 started
[3] => task_4 started
)
配列への参照渡し
『array_push()』や『array_pop()』などの配列操作関数は、配列を参照渡しで受け取って直接変更します。関数内からこれらを呼ぶ際は、通常の引数で渡せば元の配列が変更されます。『&』による参照渡しを明示する必要はありません。
sample_04.php
<?php
function add_member(&$list, $name) {
// &参照で受け取った場合
array_push($list, $name);
}
function add_member_normal($list, $name) {
// 通常引数で受け取った場合は元の配列に影響しない
array_push($list, $name);
}
$items = ['item_a', 'item_b'];
add_member($items, 'item_c');
echo "参照渡し後: " . count($items) . "件\n";
add_member_normal($items, 'item_d');
echo "値渡し後: " . count($items) . "件\n";
実行すると次のように出力されます。
php sample_04.php 参照渡し後: 3件 値渡し後: 3件
実践パターン
スタック(LIFO)として使う
配列をスタック(後入れ先出し)として使います。『array_push()』で積み上げ、『array_pop()』で取り出します。
sample_05.php
<?php
$history = [];
// 訪問したページを積み上げる
array_push($history, 'page_1');
array_push($history, 'page_2');
array_push($history, 'page_3');
echo "現在地: " . end($history) . "\n";
// 最後に訪問したページから戻る(LIFO)
while (!empty($history)) {
$page = array_pop($history);
echo "戻る: " . $page . "\n";
}
実行すると次のように出力されます。
php sample_05.php 現在地: page_3 戻る: page_3 戻る: page_2 戻る: page_1
キュー(FIFO)として使う
配列をキュー(先入れ先出し)として使います。『array_push()』でエンキューし、『array_shift()』でデキューします。
sample_06.php
<?php
$queue = [];
// 処理待ちタスクを追加
array_push($queue, 'メール確認');
array_push($queue, 'レポート作成');
array_push($queue, 'データ集計');
// キューから順番に処理(FIFO)
while (!empty($queue)) {
$task = array_shift($queue);
echo "処理中: " . $task . "\n";
}
実行すると次のように出力されます。
php sample_06.php 処理中: メール確認 処理中: レポート作成 処理中: データ集計
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。