严格的标准,只有变量应该传递PHP错误

时间:2013-08-03 12:41:38

标签: php

我在第18行和第20行收到错误“严格标准:只能在中通过引用传递变量”。

第18行:

$phpinfo[end(array_keys($phpinfo))][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3];

第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 个答案:

答案 0 :(得分:3)

这是因为您将函数的结果传递给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];
}

答案 1 :(得分:1)

end()接收对变量的引用,因为它会修改其值。

你传递了一个值。因此错误:

  

变量应通过引用

传递

你应该传递一个变量:

$keys = array_keys($phpinfo);
$phpinfo[end($keys)];