2014-09-19 69 views
1

我一直在思考這樣的陣列,對於代碼的可讀性我傾向於使用內置功能的PHP像range & array_combine生成的數字像這樣的數組:PHP array_combine和範圍VS foreach循環來獲取數字

array(
    5 => 5, 
    10 => 10, 
    15 => 15, 
    20 => 20, 
    25 => 25, 
    ... 
    60 => 60 
); 

所以目前我使用它來生成上述:

$nums = range(5, 60, 5); 
$nums = array_combine($nums, $nums); 

我想知道是否有這樣的上述方法和簡單地使用環之間的速度或存儲器差:

for ($i = 5; $i <= 60; $i++) { 
    $nums[$i] = $i; 

    $i += 5; 
} 

我只是想知道,如果我的方法是好的做法,或者如果有人會看我的代碼會試圖找出我住的地方?

+1

此問題最適合[codereview.stackexchange.com](http://codereview.stackexchange.com)。此外,性能測試是通過簡單地在函數執行前後獲取時間戳,然後比較兩者之間的時間來完成的。請繼續嘗試,並讓我們知道你是否無法弄清楚。 – Ohgodwhy 2014-09-19 16:05:42

+0

@Ohgodwhy會做測試。我仍然想從方法的角度來了解它的正確方法,還是僅僅依賴於自己的觀點 – GGio 2014-09-19 16:07:11

+1

'range'仍然使用for循環來實現這一點,它僅僅是一個包裝。 – Ohgodwhy 2014-09-19 16:09:15

回答

2

下面的方法似乎對少數快:

$tmp = range(5,$limit,5); 
$tmp = array_combine($tmp, $tmp); 

然而,for循環是更大的數字要快得多:

for($i =5; $i<=$limit; $i += 5) 
    $tmp[$i] = $i; 

試試下面的代碼here

<?php 
$limit = 200; 

$time_start = microtime(true); 
$tmp = range(5,$limit,5); 
$tmp = array_combine($tmp, $tmp); 
$time_end = microtime(true); 
echo $time_end - $time_start; 
echo "<br/>"; 
//print_r($tmp); 
echo "<br/>"; 


$time_start = microtime(true); 
$tmp = array(); 
for($i =5; $i<=$limit; $i += 5) 
    $tmp[$i] = $i; 
$time_end = microtime(true); 
echo $time_end - $time_start; 
echo "<br/>"; 
//print_r($tmp); 

對於$limit = 200第一種方法更快:

1=> 2.0980834960938E-5 
2=> 2.1934509277344E-5 

範圍&組合獲勝!

$limit = 500第二種方法是更快:

1=> 3.7908554077148E-5 
2=> 2.9087066650391E-5 

爲環勝!

所以在我看來,我會選擇第二種方法(for循環),因爲對於小數字,即使第一種方法更快,時間差異可以忽略不計。然而,對於大量的,第二個方法是總是更快,而且我們在計算機科學關心的最壞的時候

結論:

For循環是贏家!

+1

謝謝您花時間和解釋。 – GGio 2014-09-23 13:25:09