【问题标题】:php 8.1 explode causes error when result is assigned to list将结果分配给列表时,php 8.1 explode 会导致错误
【发布时间】:2023-02-18 07:54:07
【问题描述】:

我使用的是 PHP 8.1,在拆分不在字符串中的内容时出现错误。 这不是 PHP 7.4 的问题。

$str = "This string has no dash";
list($a, $b) = explode('-', $str, 2);

Error : Undefined array key 1

手册没有提到这种行为。 https://www.php.net/manual/en/function.explode.php

那么发生了什么?

【问题讨论】:

  • 3v4l.org/BqsbK 这似乎也在 7.4 上引发了问题。你能解释一下你的用例吗,你为什么要分解不是字符串的东西?
  • 为什么您希望在 explode() 文档中对此进行描述?问题在于分配给列表——元素的数量必须匹配。
  • @JacobMulquin 你为什么认为它不是字符串?
  • 您不需要 explode() 也能看到此错误:list ($a, $b) = ["foo"]; 将产生相同的错误。
  • 我认为 7.4 和 8.0 之间的变化是这从警告变成了错误。而且我猜你没有显示警告,所以你没有注意到这个问题。

标签: php explode


【解决方案1】:
$str = "This string has no dash";
if (strpos($str, '-') !== false) {
  list($a, $b) = explode('-', $str, 2);
} else {
  $a = $str;
  $b = '';
}

【讨论】:

    【解决方案2】:

    问题是 explode 将生成单个元素,因此您不能在两个变量中破坏结果数组。

    这里的错误很明显:$b 试图从array[1] 中获取一个值,其中array 是分解结果。由于 $str 中不包含破折号,因此 explode 生成单个元素,如前所述。

    因为你可能不知道explode 会产生多少元素,所以我建议不要对这种操作使用数组解构,除非你真的确定结果计数。

    【讨论】:

      【解决方案3】:

      在没有分隔符的情况下使列表解构工作的最肮脏的小解决方法是不加选择地用后备值填充数组(例如,如果您对缺少'-'和尾随'-'之间的区别不感兴趣,则为空字符串):

       list($a, $b) = explode('-', $str, 2)[]='';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多