假设我有这个代码
$x = array("a", "b", "c", "d", "e");
是否有任何函数可以在创建后调用以复制值,因此在上面的示例中$x
将变为
array("a", "b", "c", "d", "e", "a", "b", "c", "d", "e");
我想了一些类似以下的东西,但它不起作用。
$x = $x + $x;
$x = array("a", "b", "c", "d", "e");
$x = array_merge($x,$x);
将数组合并到其自身上将按顺序重复值。
php > $x = array("a", "b", "c", "d", "e");
php > print_r(array_merge($x, $x));
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => a
[6] => b
[7] => c
[8] => d
[9] => e
)
这应该可以做到:
$x = array("a", "b", "c", "d", "e");
$x = array_merge($x,$x);
您可以循环遍历数组,并将每个变量循环到一个单独的重复数组。下面是我脑海中浮现的一些代码:
$x = array("a", "b", "c", "d", "e");
$duplicateArray = $array;
foreach ($x as $key) {
$duplicateArray[] = $key;
}
foreach ($x as $key) {
$duplicateArray[] = $key;
}
$x = array_merge($x, $x);
如果你愿意的话,你也可以循环和复制。
首先,应该问:为什么将冗余数据推送到输入数组中是有益的?
如果出于表示目的需要访问循环中的数据,可以省去数组膨胀,只需更改元素的迭代方式。
例如,您可以在原始数组上调用两个单独的foreach()
循环。
foreach ($x as $v) {
echo "$v'n";
}
foreach ($x as $v) {
echo "$v'n";
}
或者使用单个for()
循环,可以使用模数计算来访问适当的元素。演示
$count = count($x);
for ($i = 0, $limit = $count * 2; $i < $limit; ++$i) {
echo $x[$i % $count] . "'n";
}
现在,如果确实需要将数组的值附加在原始索引数组之后,并保持平坦的索引结构,那么array_merge()
是明智和直观的,但不是唯一的方法。
使用spread/splat运算符(...
(,可以在新数组中对输入元素进行两次解包。虽然这是一种无功能的方法,使用的字符较少,但它有一个不太高效的习惯。演示
$result = [...$x, ...$x];
也许我最喜欢的方法是调用array_push()
,并在将数据推入原始数组时对数组的元素进行解包。我不知道它与array_merge()
相比表现如何,但我发现将数据附加到原始数组的操作是直观/字面的。演示
array_push($x, ...$x);
对于函数式方法,array_reduce()
可以通过其第三个参数(在本例中为整个输入数组(设置其初始数据有效载荷,然后仅将每个元素一次推送到结果数组中。演示
var_export(
array_reduce(
$x,
function($result, $v) {
$result[] = $v;
return $result;
},
$x
)
);
尽管用于此任务是不直观的,但当向索引数组提供两次时,array_merge_recursive()
的工作方式与array_merge()
类似。演示
$result = array_merge_recursive($x, $x)
毕竟,我应该提醒大家,有些技巧是需要避免的。
$result = array_replace($x, $x);
毫无意义- 数组联合运算符是无用的
- CCD_ 12是不合适的,因为它的第三个参数只能接收一个值
- CCD_ 13在其结果中返回与其输入数组相同数量的元素
array_merge(...array_fill(0, 2, $x))
有效,但为什么要调用2个函数,而有0和1个函数的技术可以享受