更好的阵列循环?

时间:2011-03-14 00:38:06

标签: php arrays

我有两个数组,

其中一个有5000个数组(责备代码点火器)

$first看起来像

array(
  array('number' => 1),
  array('number' => 2),
  array('number' => 3),
  array('number' => 4),
  ...
  array('number' => 5000)
);

$second有16000行,看起来像

array(
  array('key' => 1, 'val' => 'something'),
  array('key' => 2, 'val' => 'something'),
  array('key' => 3, 'val' => 'something'),
  ...
  array('key' => 16000, 'val' => 'something'),
)

我想创建一个包含$second[$i]['val'] IF $second[$i][$key]位于$first[$i][$number]

的第三个数组

目前我在做

$third = array();
foreach($first as &$f)
  $f = $f['number'];

foreach($second as $s){
  if(in_array($s['key'], $first)
    $third[] = $s['val];
}

但是,除非我使用php的set_timeout(0)它超时,有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

$third = array();
$ftemp = array();
foreach($first as $f)
  $ftemp[$f['number']] = true;

foreach($second as $s){
  if(isset($ftemp[$s['key']]))
    $third[] = $s['val'];
}

应该更快。

不要试图像下面那样以更复杂的方式制作查找字典,因为它实际上比上面简单的循环慢:

$third = array();
$ftemp = array_flip(reset(call_user_func_array('array_map', array_merge(array(null), $first))));
// $ftemp = array_flip(array_map('reset', $first)); // this is also slower
// array_unshift($first, null); $ftemp = array_flip(reset(call_user_func_array('array_map', $first))); // and this is even slower and modifies $first array

foreach($second as $s){
  if(isset($ftemp[$s['key']]))
    $third[] = $s['val'];
}

答案 1 :(得分:0)

这可能是一种严厉的挑剔,但你可以将foreach替换为for,这会快一点,但我怀疑这会产生很大的影响。您正在开发一个大型数据集,可能在网络服务器上处理的速度不是很快。