为什么我必须将PHP的end()数组函数的结果赋给变量来操作结果?

StackOverflow https://stackoverflow.com/questions/1633301

  •  06-07-2019
  •  | 
  •  

我试图删除数组中可能为空的最后一个条目,如下所示,但是我收到错误:“不能在写入上下文中使用函数返回值”:

  if (empty(end($crontabEntryList))) {
    array_pop($crontabEntryList);
  }

如果我首先将end的返回值赋给变量(如底部),我可以删除最后一个条目,如果为空。根据 end()的手动输入,它返回最后一个元素的值或FALSE为空。阵列"通过谷歌搜索我发现可能的解释:布尔值不是“可写的”。

然而,在我的特定情况下,似乎会返回此错误,并且可能其他文件记录在SO 上,仅仅是因为可能可以返回一个布尔值。因为,我的实例中的数组肯定是为空,因此而不是false,end()“返回最后一个元素的值”。

我的假设是否正确?在这种情况下,这是不是与PHP的松散类型性质不一致?或者是因为数组的最后一个元素是“不可写”?在这种情况下,究竟是什么构成了“写上下文”。用PHP?

  $last = end($crontabEntryList);
  if (empty($last)) {
    array_pop($crontabEntryList);
  }
有帮助吗?

解决方案

这与end()或“writability”无关。布尔人。

empty() isset()不是函数,它们是语言结构。

empty() 的文档:

  

注意:empty()仅将变量检查为   其他任何东西都会导致解析   错误。换句话说,以下   不起作用:空(修剪($ name))。

再次:只有变量可以传递给 empty()

其他提示

empty()很奇怪。我刚学会接受它并尽可能地解决它(使用你提供的解决方案)。

如果您只想尝试清除数组中的空值,请尝试 array_filter()

我可以建议对end()的返回值使用否定检查吗?在我看来,end()要么返回最后一个元素的值,要么返回FALSE(如果为空)。因此,不要使用额外的代码来创建另一个用空测试的变量,而只需测试end()的返回值:

/* Edited */
if(!(trim(end($crontabEntryList)))) {
   array_pop($crontabEntryList);
}

我已经在我的系统上使用一系列字符串测试了它,它似乎有你想要的效果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top