如何在平面索引数组中重复值?(按顺序将所有元素附加到数组末尾)


How to duplicate values in a flat, indexed array? (Append all elements to end of array in order)

假设我有这个代码

$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)

毕竟,我应该提醒大家,有些技巧是需要避免的。

  1. $result = array_replace($x, $x);毫无意义
  2. 数组联合运算符是无用的
  3. CCD_ 12是不合适的,因为它的第三个参数只能接收一个值
  4. CCD_ 13在其结果中返回与其输入数组相同数量的元素
  5. array_merge(...array_fill(0, 2, $x))有效,但为什么要调用2个函数,而有0和1个函数的技术可以享受