2014-09-19 68 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