Я имею два массива в 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 )
Как проверить, находится ли какой-либо элемент People в массиве Wanted Criminals ?
В этом примере он должен вернуть true
потому что 20
находится в Wanted Criminals .
Заранее спасибо.
Вы можете использовать array_intersect()
.
$result = !empty(array_intersect($people, $criminals));
Существует немного неправильного использования array_intersect () и count () (вместо пустого).
Например:
$bFound = (count(array_intersect($criminals, $people))) ? true : false;
если «пустой» – это не лучший выбор, как насчет этого:
if (array_intersect($people, $criminals)) {...} //when found
или
if (!array_intersect($people, $criminals)) {...} //when not found
Тест производительности для in_array vs array_intersect:
$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 по крайней мере в 5 раз быстрее. Обратите внимание, что мы «ломаем», как только результат будет найден.
Этот код недействителен, поскольку вы можете передавать только переменные в языковые конструкции. 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, безусловно, более удобен в использовании, оказывается, что он не является превосходным с точки зрения производительности. Я тоже создал этот скрипт:
<?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 и проверил производительность каждого из них. Интересно то, что общее время процессора, то есть время пользователя + системное время для PHP5.6 одинаково, а также то же самое. Общее время процессора в PHP5.4 меньше для in_array, чем array_intersect, хотя и незначительно.