array_slice() の第4引数
まずは公式ドキュメントからの引用。
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
)