array_slice() の第4引数

2014年10月14日 00:49

まずは公式ドキュメントからの引用。

length が指定され、正の場合、配列の要素の中から最大でその数までの要素を返します。 配列の要素数が length より少ない場合は、配列から取得できる要素だけを返します。length が指定され、負の場合、配列の末尾から連続する複数の要素が返されます。省略された場合、offset から配列の最後までの全ての要素が返されます。

array_slice() の要素数より多い数を第3引数に指定した場合については、これで解決。続いて、第4引数の件。こちらも今一度引用しておく。

array_slice() はデフォルトで配列の数値キーを並べなおし、リセットすることに注意してください。preserve_keys を TRUE にする事でこの動作を変更することができます。

実際にコードを書いて試してみる。

$test = array(
    'a' => 'red',
    '01' => 'green',
    '20' => 'blue'
);

print_r(array_slice($test, 0, 3));

偉そうに「書いてみる」と言いつつ、ここに書かれたサンプルコードそのものだったりするが、結果はこうなる。

Array
(
    [a] => red
    [01] => green
    [0] => blue
)

これ、最初は何が起きているのかよく分からなかったが、しばらく思案してみてようやく理解できた。3つのキーのうち 'a''01' は文字列だが、'20' は数値と見なされるため、リセットされてゼロが割り振られているわけだ。

当然というか、第4引数に true を渡せばこうはならない。

print_r(array_slice($test, 0, 3, true));
Array
(
    [a] => red
    [01] => green
    [20] => blue
)