我知道更有效的方式來循環數組是foreach,或者將count存儲在變量中以避免多次調用它。 不過我很好奇,如果PHP有某種「緩存」的東西,如:PHP能夠在循環內緩存計數呼叫嗎?
for ($i=0; $i<count($myarray); $i++) { /* ... */ }
是否有類似的東西,我很想念它,或者它沒有任何東西,你應該代碼:
$count=count($myarray);
for ($i=0; $i<$count; $i++) { /* ... */ }
我知道更有效的方式來循環數組是foreach,或者將count存儲在變量中以避免多次調用它。 不過我很好奇,如果PHP有某種「緩存」的東西,如:PHP能夠在循環內緩存計數呼叫嗎?
for ($i=0; $i<count($myarray); $i++) { /* ... */ }
是否有類似的東西,我很想念它,或者它沒有任何東西,你應該代碼:
$count=count($myarray);
for ($i=0; $i<$count; $i++) { /* ... */ }
PHP的確如你所說的那樣。該數組的長度可能會在循環內部發生變化,因此可能是,目的是,您在每次迭代中調用count
。 PHP不會試圖推斷你在這裏的意思,也不應該這樣。因此,執行此操作的標準方法是:
for ($i = 0, $length = count($myarray); $i < $length; $i++)
每次循環迭代時,PHP都會執行計數。但是,PHP確實保持了陣列大小的內部跟蹤,所以count是一個相對便宜的操作。這不像PHP是從字面上計算數組中的每個元素。但它仍然不是免費的。
使用一個非常簡單的千萬個項目數組做一個簡單的變量增量,我得到了2.5秒的循環計數版本和0.9秒的循環計數。一個相當大的差異,但不是「巨大的」。
編輯:代碼:
$x = range(1, 10000000);
$z = 0;
$start = microtime(true);
for ($i = 0; $i < count($x); $i++) {
$z++;
}
$end = microtime(true); // $end - $start = 2.5047581195831
切換做
$count = count($x);
for ($i = 0; $i < $count; $i++) {
否則其他一切不變,時間爲0.96466398239136
特別考慮一個這樣大小的數組。 – 2012-03-15 05:01:43
PHP是一種命令式語言,這意味着這是不應該優化任何可能有任何影響的東西。鑑於它也是一種解釋性語言,即使有人真正想要,也不可能安全地完成。
另外,如果你只是想遍歷數組,你真的想要使用foreach。在這種情況下,不僅可以複製計數,而且還可以複製整個陣列(並且可以根據需要修改原始的那個)。或者你可以使用foreach ($arr as &$el) { $el = ... }; unset($el);
來修改它。我的意思是說,PHP(與其他語言一樣)通常爲您的原始問題提供更好的解決方案(如果有的話)。
我不同意*整個數組將被複制*因爲PHP是Copy On Write語言。 – StormByte 2017-09-14 08:25:14
這很好,儘管我更喜歡在循環控制結構之外初始化$ length,以防我需要將它引用到代碼中的其他位置。 – 2012-03-15 05:02:26
@Mike取決於目的。如果'$ length'只在循環中使用,將其放在循環初始化中更加慣用。如果你明確需要它,你應該在循環之外初始化它。 – deceze 2012-03-15 05:04:16