2013-08-03 103 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)]; 
相關問題