array_splice

マニュアル
http://www.php.net/manual/ja/function.array-splice.php


Perlのspliceと同じように使ったら間違っていたのでメモ。


array_spliceは配列の値を削除したり挿入したり置き換えたり
いろんなことができる関数です。

<?php

$array1 = range(0, 9);
array_splice($array1, 5); // 添字5から先を削除
print_r($array1);
/*
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
)
*/

$array2 = range(0, 9);
array_splice($array2, 4, 2); // 添字4から2個削除
print_r($array2);
/*
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 6
    [5] => 7
    [6] => 8
    [7] => 9
)
*/

$array3 = range(0, 9);
array_splice($array3, 2, 0, 100); // 添字2の位置に100を挿入
print_r($array3);
/*
Array
(
    [0] => 0
    [1] => 1
    [2] => 100
    [3] => 2
    [4] => 3
    [5] => 4
    [6] => 5
    [7] => 6
    [8] => 7
    [9] => 8
    [10] => 9
)
*/

$array4 = range(0, 9);
array_splice($array4, 2, 1, 100); // 添字2の値を100に置き換える
print_r($array4);
/*
Array
(
    [0] => 0
    [1] => 1
    [2] => 100
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [9] => 9
)
*/

$array5 = range(0, 9);
array_splice($array5, 1, 3, 100); // 添字1から3個削除し、100を挿入する
print_r($array5);
/*
Array
(
    [0] => 0
    [1] => 100
    [2] => 4
    [3] => 5
    [4] => 6
    [5] => 7
    [6] => 8
    [7] => 9
)
*/


多次元の配列を扱うときは少し注意が必要で、、、

<?php
$array = array(
    array(1, 2, 3),
    array(4, 5, 6),
    array(7, 8, 9),
);
array_splice($array, 1, 0, array(101, 102, 103));
print_r($array);

こんな感じに書くと出力は

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [1] => 101
    [2] => 102
    [3] => 103
    [4] => Array
        (
            [0] => 4
            [1] => 5
            [2] => 6
        )

    [5] => Array
        (
            [0] => 7
            [1] => 8
            [2] => 9
        )

)

こうなってしまいます。


array_spliceは複数の値を挿入するとき
引数を増やすのではなくて第4引数に挿入したい値の配列を渡してやります。
なのでこの場合は

<?php
$array = array(
    array(1, 2, 3),
    array(4, 5, 6),
    array(7, 8, 9),
);
array_splice($array, 1, 0, array(array(101, 102, 103)));
print_r($array);

とするとうまくいくわけです。


array_pushとかarray_unshiftは引数を増やすタイプなのに
なんでarray_spliceだけは違うのだろうか、、、