我在第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];
}
非常感谢你们给我的任何帮助。
答案 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)];