我有两个数组,
其中一个有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)
它超时,有更好的方法吗?
答案 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
,这会快一点,但我怀疑这会产生很大的影响。您正在开发一个大型数据集,可能在网络服务器上处理的速度不是很快。