如何处理 Null 上的 array_shift()?

How to handle array_shift() on Null?

提问人:Martin AJ 提问时间:8/22/2023 最后编辑:Gugu72Martin AJ 更新时间:8/22/2023 访问量:69

问:

请看一下这段代码:

$end = isset($newvar) ? array($newvar) : null;
while($ends = array_shift($end)){
  ...

当我使用 PHP 时,它运行良好,但是升级到 后,它会抛出:7.28.1

PHP 致命错误:未捕获的 TypeError:array_shift():参数 #1 ($array) 必须是数组类型,在 /path/to/qanda.php:469 中给出 null

知道我该如何解决它吗?

致命错误 php-8

评论

0赞 Gugu72 8/22/2023
与问题没有直接关系,但你应该使用 ,因为 的复杂度是 O(n) 并且是 O(1)。在大型数据集上使用可能需要很长时间array_reversearray_poparray_shiftarray_poparray_shift
0赞 Martin AJ 8/22/2023
您的意思是同时使用两者并且具有比 ?array_reversearray_poparray_shift's
0赞 Gugu72 8/22/2023
您只需要使用一次,array_pop的性能比array_shift好得多:php.net/manual/en/function.array-shift.php#112947array_reverse
2赞 M. Eriksson 8/22/2023
这看起来确实是一个 XY 问题。循环的意义何在?为什么不直接将值添加到数组中,只是为了让它恢复原样呢?whileif (isset($newvar)) { ...do something... }while
2赞 M. Eriksson 8/22/2023
@Gugu72 - 在这种情况下,这是一个有争议的问题,因为数组永远不会包含多个元素

答:

5赞 Nick 8/22/2023 #1

只需改用空数组即可:

$end = isset($newvar) ? array($newvar) : [];

array_shift将在第一次调用时返回,并将空数组作为输入,因此循环不会执行。null

4赞 AymDev 8/22/2023 #2

最基本的解决方案是将该值替换为空数组以符合类型要求:null

$end = isset($newvar) ? array($newvar) : [];
while($ends = array_shift($end)){

您还可以创建数组并在 null 上使用 null 合并运算符$newvar

$end = [$newvar ?? null];
while($ends = array_shift($end)){

但是我不明白为什么你会创建一个具有单个值的数组,然后使用 的返回值创建一个循环。循环体将仅运行一次。 也许只是使用一个条件?array_shift

if (isset($newvar)) {

评论

1赞 Nick 8/22/2023
你提出了一个好观点!