配列の要素を追加・削除・取得するPHPの関数

他のプログラミング言語と同じように、PHPにも配列の要素を追加・削除・取得するための関数が標準で定義されています。また、複数の配列のマージ(結合)や重複した値の削除といった処理も標準の関数だけで行うことができます。

配列の先頭の要素を1つ取り出す array_shift()

array_shift()は、引数で渡された配列の先頭の要素を1つ取り出して返します。取り出された要素は配列から削除され、添字は0から順に振り直されますが、連想配列のキーは変更されません。

PHP

<?php
$array = array('a', 'foo' => 'b', 'c');
$element = array_shift($array);
echo '取り出された要素:' . $element, PHP_EOL;
var_dump($array);
/* 出力:
取り出された要素:a
array(2) {
  ["foo"]=>
  string(1) "b"
  [0]=>
  string(1) "c"
}
*/
?>

配列の先頭に1つ以上の要素を追加する array_unshift()

array_unshift()は、第1引数で渡された配列の先頭に第2引数以降で渡された要素を追加し、追加後の要素数を返します。配列の添字は0から順に振り直されますが、連想配列のキーは変更されません。

PHP

<?php
$array = array('foo' => 'a', 'b');
$count = array_unshift($array, 'c', 'd');
echo '要素数:' . $count, PHP_EOL;
var_dump($array);
/* 出力:
要素数:4
array(4) {
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "d"
  ["foo"]=>
  string(1) "a"
  [2]=>
  string(1) "b"
}
*/
?>

配列の末尾の要素を1つ取り出す array_pop()

array_pop()は、引数で渡された配列の末尾の要素を1つ取り出して返します。取り出された要素は配列から削除されます。

PHP

<?php
$array = array('a', 'foo' => 'b', 'c');
$element = array_pop($array);
echo '取り出された要素:' . $element, PHP_EOL;
var_dump($array);
/* 出力:
取り出された要素:c
array(2) {
  [0]=>
  string(1) "a"
  ["foo"]=>
  string(1) "b"
}
*/
?>

配列の末尾に1つ以上の要素を追加する array_push()

array_push()は、第1引数で渡された配列の末尾に第2引数以降で渡された要素を追加し、追加後の要素数を返します。配列の末尾に1つだけ要素を追加したい場合は、$array[] = 値;とした方が動作は高速です。

PHP

<?php
$array = array('a', 'foo' => 'b');
$count = array_push($array, 'c', 'd');
echo '要素数:' . $count, PHP_EOL;
var_dump($array);
/* 出力:
要素数:4
array(4) {
  [0]=>
  string(1) "a"
  ["foo"]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  string(1) "d"
}
*/
?>

配列の一部を取得して配列で返す array_slice()

array_slice()は、第1引数で渡された配列の一部を取得して返します。第2引数で開始位置、第3引数で取得する要素数を指定します。第3引数を省略した場合は配列の最後までとなります。また、第2, 3引数で負の値を指定した場合は、配列の末尾から数えた位置となります。

第4引数では、配列のキーを維持するかをBool値で指定します。初期値はfalseとなっているため、省略した場合、array_slice()が返す配列では、連想配列のキーは維持されますが、添字は0から振り直されます。また、array_slice()は元の配列を変更しません。

PHP

<?php
$array = array('a', 'foo' => 'b', 'c', 'hoge' => 'd', 'e');
print_r(array_slice($array, 3));
print_r(array_slice($array, 1, 2, true));
print_r(array_slice($array, -3, -1));
/* 出力:
Array
(
  [hoge] => d
  [0] => e
)
Array
(
  [foo] => b
  [1] => c
)
Array
(
  [0] => c
  [hoge] => d
)
*/
?>

配列の一部を削除して他の要素で置換する array_splice()

array_splice()は、第1引数で渡された配列の一部を削除し、第4引数の配列で置換します。第2引数で開始位置、第3引数で削除する要素数を指定しますが、負の値を指定した場合は、配列の末尾から数えた位置となります。戻り値は、削除される要素を持つ配列となります。

第1引数の配列では、連想配列のキーは維持されますが、数値添字は維持されません。また、第4引数の連想配列のキーは無視され、添字配列として扱われる点には注意が必要です。

PHP

<?php
$array1 = array('foo' => 1, 2, 'hoge' => 3, 4, 5);
$array2 = array(6, 'bar' => 7, 8);
$result = array_splice($array1, 1, 3, $array2);
print_r($result);
print_r($array1);
/* 出力:
Array
(
  [0] => 2
  [hoge] => 3
  [1] => 4
)
Array
(
  [foo] => 1
  [0] => 6
  [1] => 7
  [2] => 8
  [3] => 5
)
*/
?>

複数の配列をマージする array_merge()

array_merge()は、第1引数の配列に対して第2引数以降の配列をマージして返します。連想配列のキーが重複した場合は上書きされますが、添字の場合は上書きされるのではなく配列の最後に追加されます。

PHP

<?php
$array1 = array(1, 'foo' => 'a', 2);
$array2 = array('foo' => 'b', 3);
$array3 = array(4, 'hoge' => 'c');
$result = array_merge($array1, $array2, $array3);
print_r($result);
/* 出力:
Array
(
  [0] => 1
  [foo] => b
  [1] => 2
  [2] => 3
  [3] => 4
  [hoge] => c
)
*/
?>

配列から重複した値を削除し、結果を新しい配列を返す array_unique()

array_unique()は、第1引数の配列から重複した値を削除し、結果を新しい配列で返します。第2引数では、値を数値として比較する場合はSORT_NUMERIC、文字列として比較する場合はSORT_STRINGを指定します。省略した場合は、SORT_STRINGとなります。返される配列では、元の配列の各値における最初のキーが維持されます。

PHP

<?php
$array = array('foo' => 1, 2, 1, 3, 'hoge' => 2, 3);
$result = array_unique($array, SORT_NUMERIC);
print_r($result);
/* 出力:
Array
(
  [foo] => 1
  [0] => 2
  [2] => 3
)
*/
?>

配列を分割して結果を多次元配列で返す array_chunk()

array_chunk()は、第1引数の配列を分割した多次元配列を返します。第2引数では、配列を分割する際の要素数を指定します。第3引数では、キーを維持するかをBool値で指定します。第3引数を省略、またはfalseを指定した場合、連想配列のキーも含めて、添字は0から順に振り直されます。

PHP

<?php
$array = array('a', 'foo' => 'b', 'c', 'hoge' => 'd', 'e');
$result = array_chunk($array, 2, true);
print_r($result);
/* 出力:
Array
(
  [0] => Array
    (
      [0] => a
      [foo] => b
    )

  [1] => Array
    (
      [1] => c
      [hoge] => d
    )

  [2] => Array
    (
      [2] => e
    )

)
*/
?>