-2

18 行目と 20 行目で " Strict Standards: Only variables should be passed 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 に答える