2012-09-10 117 views
19

理論上的問題可能沒有任何意義,但仍然可能有一個聰明的答案。只返回鍵的PHP foreach

我想遍歷數組,並獲得它的鍵和他們的東西。我做什麼一個簡單的例子:現在

foreach($array as $key => $value) { 
    $other_array[$key] = 'something'; 
} 

PHP Mess Detector尖叫說$value在此範圍內使用。因此,我想這可能不是訪問我的arraykeys的最佳方式。

任何想法如何做到這一點,而不會不必要地從我的array中取出values?它是否有任何顯着的性能影響...或者我只是偏執狂,應該繼續而不浪費任何時間愚蠢的問題:)。

+0

這很正常。但是U可以使用這個:$ keys = array_key($ array); foreach($ key爲$ key){ $ other_array [$ key] ='something'; } – Sergey

+0

您可以針對下列情況抑制混亂檢測器的警告: http://phpmd.org/documentation/suppress-warnings.html – wkm

回答

37

你可以做這樣的事情

foreach(array_keys($array) as $key) { 
// do your stuff 
} 

這將使的foreach疊代由來自按鍵陣列您數組而不是實際的數組。請注意,從性能角度來看,這可能不會更好。

+0

我相信array_keys()會在這裏被每次迭代調用,所以它可能不是最聰明的舉動? –

+0

沒有從我記得數組進入foreach,如果評估一次。就像* foreach(數組(「a」,「b」,「c」)爲$字母)*不會在每次迭代時創建一個新數組。如果這是不正確的,那麼確定,在foreach之前創建一個$ keys變量......你有沒有任何參考指向foreach在每次迭代中評估數組的事實? – inquam

+2

從我可以看到foreach()是使用迭代器實現的,因此只調用一次返回數組的函數。然後它使用指向現有結果集的迭代器繼續每個項目。因此,對於* foreach(array_keys()... * – inquam

5

是的,有做這樣一個更快的方法:http://php.net/manual/en/function.array-keys.php

+0

+1因爲在錢上,但是詢問給出了一個很好的例子,所以他得到了好處; ) – RandomWhiteTrash

+1

我不太確定創建一個包含初始數組的鍵(這是array_keys所做的)的新數組是* *更快*。但至少可以完成這項工作。 – inquam

+0

我還沒有做基準測試,但我認爲它比來自提問者的代碼更快,其中也建立了一個新的數組。 array_keys()在內部以優化的方式(我希望)而不是使用腳本語言本身。 – LeJared

1

如果你想將所有鍵設置一定的價值,你可以做這樣說:

$array = array(
     'foo'=> 'oldval1', 
     'bar'=> 'oldval2', 
     'baz'=> 'oldval3' 
); 

$other_array = array_fill_keys(array_keys($array), 'something'); 
print_r($other_array); 

這將產生:

Array 
(
    [foo] => something 
    [bar] => something 
    [baz] => something 
) 
+0

+1這個想法雖然這不是我想到的 - 例子過於簡單:)。無論如何謝謝 - 學習新東西:) – RandomWhiteTrash

5

,請忽略此消息。

在PHP中,您使用foreach的方式是最快的。這是對的,你應該避免未使用的變量,但在這種情況下,你無法避免它,而不會失去一些性能。

E.g. foreach(array_keys($arr) as $key)foreach($arr as $key => $notUsed)慢大約50%到60%

此問題的phpmd已經報告here,並且還有一個拉動請求here

直到phpmd更新,你也可以(在我的情況線123)使用this little hack

在文件/src/main/php/PHPMD/Rule/UnusedLocalVariable.php的方法collectVariables(..)更換

if ($this->isLocal($variable)) 

通過

if ($this->isLocal($variable) && !($this->isChildOf($variable, 'ForeachStatement') && $variable->getName() === '$notUsed')) 

這將從報告中停止phpmd $notUsed任意位置 ach循環。

0

循環,以避免一段時間的foreach。

$a = ['1','A','B','12','ui']; 

while(true) { sleep(1); 
    $b = next($a) ? current($a): reset($a); 
    echo key($a) , ':' , $b , PHP_EOL; 
}