2011-07-07 35 views

回答

2

我不能按照下面konforces答案的评论给出的尺寸,但是这一个是最低限度的速度比在foreach使用裁判:

$c=count($array); 
for(
    $i=0; 
    $i<$c 
    ; 
    $array[$i]=$array[$i]['bleh'], 
    $i++ 
); 

韩元并不是说实际衡量它是微不足道的,时间变化取决于哪一个是第一个,这是根据这个问题有一千万成员的数组:

foreach ref: 4.192161 
foreach key: 4.383342 
foreach copy: 4.222771 
array_map lambda: 12.240275 
array_map reset: 16.401093 
for key: 3.459406 
for copy: 4.690722 

脚本:

ini_set('memory_limit', -1); // wer're going to consume a lot. 
$arrayCount = 10000000; 

$test = 'just run'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$array = end($array); 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$array = array_map(function(){}, $array); 

$test = 'foreach ref'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
foreach($array as &$v) $v = $v['bleh']; 
unset($v); 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 
printf("%s: %f\n", $test, $diff); 

$test = 'foreach key'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
foreach($array as $k => $v) $array[$k] = $v['bleh']; 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 

printf("%s: %f\n", $test, $diff); 
$test = 'foreach copy'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
foreach($array as $k => $v) $arrayb[] = $v['bleh']; 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 
unset($arrayb); 
printf("%s: %f\n", $test, $diff); 

$test = 'array_map lambda'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
$array = array_map(function($e) { return $e['bleh']; }, $array); 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 
printf("%s: %f\n", $test, $diff); 

$test = 'array_map reset'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
$array = array_map('reset', $array); 
foreach($array as $k => $v) $arrayb[] = $v['bleh']; 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 
printf("%s: %f\n", $test, $diff); 

$test = 'for key'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
for($i=0,$c=count($array);$i<$c;$array[$i]=$array[$i]['bleh'],++$i); 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 
printf("%s: %f\n", $test, $diff); 

$test = 'for copy'; 
$array = array_fill(0, $arrayCount, array("bleh" => 109720,)); 
$start = microtime(1); 
for($i=0,$c=count($array);$i<$c;$arrayb[]=$array[$i]['bleh'],++$i); 
$diff = microtime(1)-$start; 
$tests[$test] = $diff; 
unset($arrayb); 
printf("%s: %f\n", $test, $diff); 
+0

精湛而深入的答案 – FinalForm

3

如果你需要一个快速的解决方案(良好的执行速度),那么:

$a = /* the original array */; 
$b = array(); 
foreach ($a as $value) { 
    $b[] = $value['bleh']; 
} 
6

使用array_map

$a = array_map(function($e) { return $e['bleh']; }, $a); 
+0

啊,你打我吧:) –

+0

好答案!但是,使用lambda表达式将仅限于PHP 5.3。 – danielrsmith

+0

看起来不错,但效率不高。 – rid

0
<?php 
$all = array(
    array("one" => 1), 
    array("two" => 2), 
    array("three" => 3) 
); 

function getKey($item) 
{ 
    return key($item); 
} 

function getVal($item) 
{ 
    return $item[key($item)]; 
} 
$keys = array_map("getKey", $all); 
$values = array_map("getVal", $all); 
print_r($keys); 
print_r($values); 

OUTPUT: 

Array (
    [0] => one 
    [1] => two 
    [2] => three) 
Array (
    [0] => 1 
    [1] => 2 
    [2] => 3)