检查一个数组的元素是否在PHP中的另一个数组中

我在PHP中有两个数组,如下所示:

人:

Array ( [0] => 3 [1] => 20 ) 

通缉罪犯:

 Array ( [0] => 2 [1] => 4 [2] => 8 [3] => 11 [4] => 12 [5] => 13 [6] => 14 [7] => 15 [8] => 16 [9] => 17 [10] => 18 [11] => 19 [12] => 20 ) 

如何检查是否有任何 人物元素在通缉罪犯arrays中?

在这个例子中,它应该返回true因为20是在通缉罪犯

提前致谢。

你可以使用array_intersect()

 $result = !empty(array_intersect($people, $criminals)); 

使用array_intersect()和count()(而不是空)是没有什么问题的。

例如:

 $bFound = (count(array_intersect($criminals, $people))) ? true : false; 

如果“空”不是最好的select,那么这又如何呢?

 if (array_intersect($people, $criminals)) {...} //when found 

要么

 if (!array_intersect($people, $criminals)) {...} //when not found 

in_array与array_intersect的性能testing:

 $a1 = array(2,4,8,11,12,13,14,15,16,17,18,19,20); $a2 = array(3,20); $intersect_times = array(); $in_array_times = array(); for($j = 0; $j < 10; $j++) { /***** TEST ONE array_intersect *******/ $t = microtime(true); for($i = 0; $i < 100000; $i++) { $x = array_intersect($a1,$a2); $x = empty($x); } $intersect_times[] = microtime(true) - $t; /***** TEST TWO in_array *******/ $t2 = microtime(true); for($i = 0; $i < 100000; $i++) { $x = false; foreach($a2 as $v){ if(in_array($v,$a1)) { $x = true; break; } } } $in_array_times[] = microtime(true) - $t2; } echo '<hr><br>'.implode('<br>',$intersect_times).'<br>array_intersect avg: '.(array_sum($intersect_times) / count($intersect_times)); echo '<hr><br>'.implode('<br>',$in_array_times).'<br>in_array avg: '.(array_sum($in_array_times) / count($in_array_times)); exit; 

结果如下:

 0.26520013809204 0.15600109100342 0.15599989891052 0.15599989891052 0.1560001373291 0.1560001373291 0.15599989891052 0.15599989891052 0.15599989891052 0.1560001373291 array_intersect avg: 0.16692011356354 0.015599966049194 0.031199932098389 0.031200170516968 0.031199932098389 0.031200885772705 0.031199932098389 0.031200170516968 0.031201124191284 0.031199932098389 0.031199932098389 in_array avg: 0.029640197753906 

in_array至less快了5倍。 请注意,一旦find结果,我们就会“中断”。

该代码无效,因为您只能将variables传递到语言结构中。 empty()是一个语言结构。

你必须这样做两行:

 $result = array_intersect($people, $criminals); $result = !empty($result); 

你也可以使用in_array如下:

 <?php $found = null; $people = array(3,20,2); $criminals = array( 2, 4, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); foreach($people as $num) { if (in_array($num,$criminals)) { $found[$num] = true; } } var_dump($found); // array(2) { [20]=> bool(true) [2]=> bool(true) } 

虽然array_intersect当然更方便使用,但事实certificate,它在性能方面并不是非常出众的。 我也创build了这个脚本:

 <?php $found = null; $people = array(3,20,2); $criminals = array( 2, 4, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); $fastfind = array_intersect($people,$criminals); var_dump($fastfind); // array(2) { [1]=> int(20) [2]=> int(2) } 

然后,我分别在http://3v4l.org/WGhO7/perf#tabs和http://3v4l.org/g1Hnu/perf#tabs上运行这两个片段,并检查了每个片段的性能。; 有趣的是,总的CPU时间,即用户时间+系统时间是相同的PHP5.6和内存也是一样的。 在in_array中,PHP5.4下的总CPU时间要比array_intersectless,尽pipe如此。