严格标准:在遍历数组时,只应通过引用传递变量

时间:2014-09-04 13:51:02

标签: php

以下代码......

$msgArr = split("\n", $message);
$newMsg = "";
foreach ($msgArr as $msg){
    if (trim(end(split(":", $msg))) != '')
        $newMsg .= $msg . "\r\n";
}

似乎生成错误:严格标准:在第1033行的/home/siteurl/public_html/questionnaire/full_questionnaire_submitted.php中,只能通过引用传递变量

为什么会这样?

非常感谢提前。

3 个答案:

答案 0 :(得分:2)

遵循严格的标准,您应该只将变量传递给end()而不是直接传递函数返回值。这是因为end()通过引用消耗了它的参数。 (查看@ NiettheDarkAbsol的好解释)

这一行:

if (trim(end(split(":", $msg))) != '')

应该是:

$pieces = split(":", $msg);
if (trim(end($pieces)) !== '') 

答案 1 :(得分:1)

结束函数将您传递的数组的光标作为参数移动,在您传递分割返回的情况下,不能通过引用传递。

答案 2 :(得分:1)

end()具有以下签名:

mixed end ( array &$array )

因此它需要引用作为其参数。引用通过指向变量来工作,而不是复制变量的值(通常就是这种情况),这意味着你不能直接将函数的返回值传递给它,因此错误。

PHP已被编程为优雅地处理这种事情,因为它只是创建一个内部临时变量的简单问题,因此它将继续工作,但你会得到严格标准错误。

由于您希望从最后:到字符串末尾获取修剪过的文本,请考虑:

$lastpiece = trim(substr(strrchr($msg,":"),1));

这使用strrchr获取从上一个:到结尾的所有内容substr,以便在最后:之前完成trim