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

时间:2009-10-27 19:57:04

标签: php arrays boolean

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

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

如果我首先将end的返回值赋给变量(如底部),我可以删除最后一个条目(如果为空)。根据{{​​3}},它返回最后一个元素的值,或者为空数组返回FALSE。“通过谷歌搜索,我发现manual entry for end():布尔值不是“可写的”。

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

这与布尔的end()或“可写性”无关。

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

来自the docs for empty()

  

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

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