2013-08-03 63 views
-2

我得到的错误“严格的标准:只有变量应该通过参考传递”:严格的标准,只有变量应该传递PHP错误

$phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3]; 
上线18和20

线18

第20行是:$phpinfo[end(array_keys($phpinfo))][] = $match[2];

这是一个安装脚本的一部分,这是一个完整的PHP代码片段:

<?php 

    ob_start(); 
    phpinfo(-1); 
    $phpinfo = array('phpinfo' => array()); 
    if(preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) 
    foreach($matches as $match){ 
     if(strlen($match[1])) 
      $phpinfo[$match[1]] = array(); 
     elseif(isset($match[3])) 
      $phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3]; 
     else 
      $phpinfo[end(array_keys($phpinfo))][] = $match[2]; 
    } 

非常感谢任何帮助,你们可以给我。

回答

2

这是因为,您将一个函数的结果为end

$last = end(array_keys($phpinfo)); 

出现错误,因为end不仅返回数组中的最后一个项目,但数组的内部指针移动到最后一个项目,以便(例如)current随后返回最后一个项目。为了能够做到这一点,end通过引用来引用它的参数,但是由于您将函数的结果传递给它,因此它没有使用的参考。

您可以分配的结果,以避免错误:

$keys = array_keys($phpinfo); 
$last = end($keys); 

不过,你最好存储$match[1]的价值和使用:

if (strlen($match[1])) { 
    $key = $match[1]; 
    $phpinfo[$key] = array(); 
} elseif (isset($match[3])) { 
    $phpinfo[$key][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3]; 
} else { 
    $phpinfo[$key][] = $match[2]; 
} 
+0

aray_pop不解决问题,我仍然得到了严格的标准警告。通过你的逻辑array_pop也修改原始数组,所以它也应该参考 – zardilior

+1

参考感谢,不知道我在那里想什么。我已经更新了答案。 – cmbuckley

1

end()接收到的参考变量,因为它修改了它的值。

您正在传递一个值。因此,错误:

only variables should be passed by reference

你应该传递一个变量:

$keys = array_keys($phpinfo); 
$phpinfo[end($keys)]; 
相关问题