由于 PHP 7.3 `array_unshift()` 只能用一个参数调用。重点是什么?

Since PHP 7.3 `array_unshift()` can be called with only one parameter. What's the point?

正如在 PHP manual 关于 array_unshift() 函数中所说:

7.3.0 This function can now be called with only one parameter. Formerly, at least two parameters have been required.

我没听懂。如何使用只有一个参数的函数?

我试着猜测,但什么也没发生:

$arr = ['one' => 'test', 'two' => 'some'];
array_unshift($arr);
print_r($arr);

// Result:
// Array
// (
//    [one] => test
//    [two] => some
// )

$arr1 = ['what', 'ever'];
array_unshift($arr1);
print_r($arr1);

// Array
// (
//    [0] => what
//    [1] => ever
// )

数组没有改变。

有谁知道 PHP 贡献者的具体建议?

这只是一个猜测,但是作为函数 returns:

Returns the new number of elements in the array.

您可以将其用作 count 替代方案:

$arr1 = ['what', 'ever'];
print_r(array_unshift($arr1));    // 2

当然不是很明显

作为手册的另一个副作用:

All numerical array keys will be modified to start counting from zero

所以,它是 array_values 的部分替代品:

$arr1 = [4 => 'what', 5 => 'ever'];
array_unshift($arr1);
print_r($arr1);  // [[0] => what [1] => ever]

而且也不明显。

也许其他答案会更好地解释这种行为。

另外,感谢@NigelRen,在官方手册中你可以看到

array_push() and array_unshift() can now also be called with a single argument, which is particularly convenient wrt. the spread operator.

因此,您可以使用类似的东西:

$arr1 = [['what'], ['ever']];
array_unshift(...$arr1);
print_r($arr1);

但是这个方法的行为很奇怪o_O:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => ever
                )

            [1] => what
        )

    [1] => Array
        (
            [0] => ever
        )

)

我认为我的评论可能需要更多解释,希望这能让它更清楚。

如果我有两个数组,我想添加从第二个到第一个末尾的所有元素,使用 array_push 结合解包运算符让我这样做:

$a = [1, 2, 3];
$b = [4, 5, 6];

array_push($a, ...$b);

$a 现在是 [1, 2, 3, 4, 5, 6]

array_unshift 让我做同样的事情,但将元素添加到数组的开头。我认为使用 array_push 使示例更清晰)

在 PHP 7.3 之前,如果 $b 为空则会发出警告,因为解包一个空数组相当于只传递第一个参数。请在此处查看演示:https://3v4l.org/GZQoo$a 仍将保持不变,这是期望的结果,所以它只是日志中不必要的噪音。

在一个实际示例中,如果 $b 是由另一个函数(调用数据库等)生成的,那么如果不进行此更改,我需要在 运行 之前调用 if (!empty($b) ...防止警告的代码。现在,它默默地工作。

注意:还有其他方法可以将数组附加到另​​一个数组(array_mergearray_replace+ 运算符),但它们都有特定的合并和取消方法复制共享密钥。此方法只是将第二个的 所有 值附加到第一个,而不考虑键。