-2

我在第 18 行和第 20 行收到错误“ Strict Standards: Only variables shall be pass by reference in ”。

第 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];
    }

非常感谢你们能给我的任何帮助。

4

2 回答 2

4

这是因为您将函数的结果传递给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];
}
于 2013-08-03T12:46:21.467 回答
1

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

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

只有变量应该通过引用传递

你应该传递一个变量:

$keys = array_keys($phpinfo);
$phpinfo[end($keys)];
于 2013-08-03T12:47:54.030 回答