选择
依靠array_* 函数,您可以考虑以下几点:
function interleave(string $sep, array $arr): array {
return array_slice(array_merge(...array_map(fn($elem) => [$sep, $elem], $arr)), 1);
}
由于使用内置函数并且没有显式循环,它超过了循环 array_splice 实现在 10 个元素标记附近的速度,因此在您的情况下,简洁实现和性能之间的权衡可能是值得的。
解释
当这样调用时:
interleave('.', ['Apple', 'Orange', 'Banana']);
执行以下操作(从内到外):
地图
将每个元素映射到一对['.', $elem]:
$mapped = array_map(fn($elem) => ['.', $elem], ['Apple', 'Orange', 'Banana']);
导致:
Array
(
[0] => Array
(
[0] => .
[1] => Apple
)
[1] => Array
(
[0] => .
[1] => Orange
)
[2] => Array
(
[0] => .
[1] => Banana
)
)
合并
利用documentation 中的以下事实,使用array_merge 展平数组:
如果 [...] 数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。
$merged = array_merge(...$mapped);
导致:
Array
(
[0] => .
[1] => Apple
[2] => .
[3] => Orange
[4] => .
[5] => Banana
)
片
切掉第一个额外的分隔符:
$sliced = array_slice($merged, 1);
导致:
Array
(
[0] => Apple
[1] => .
[2] => Orange
[3] => .
[4] => Banana
)