由于 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_merge
、array_replace
和 +
运算符),但它们都有特定的合并和取消方法复制共享密钥。此方法只是将第二个的 所有 值附加到第一个,而不考虑键。
正如在 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()
andarray_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_merge
、array_replace
和 +
运算符),但它们都有特定的合并和取消方法复制共享密钥。此方法只是将第二个的 所有 值附加到第一个,而不考虑键。