173 votes

Vérification pour voir si les éléments d'un tableau sont dans un autre tableau en PHP

J'ai deux tableaux en PHP comme suit :

Personnes :

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

Criminels recherchés :

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
)

Comment puis-je vérifier si l'un des éléments Personnes se trouve dans le tableau Criminels recherchés ?

Dans cet exemple, il devrait renvoyer true parce que 20 est dans les criminels recherchés.

278voto

Greg Points 132247

Vous pouvez utiliser array_intersect().

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

33voto

papsy Points 93

Il y a peu de mal à utiliser array_intersect() et count() (au lieu de empty).

Par exemple :

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

29voto

Paul Dragoonis Points 1570

Ce code n'est pas valide car vous ne pouvez passer que des variables dans des constructions de langage. empty() est une construction de langage.

Vous devez le faire en deux lignes :

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

28voto

ihtus Points 539

si « vide » n'est pas le meilleur choix, qu'en est-il de ceci :

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

ou

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

22voto

Frank forte Points 89

Test de performance pour 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;

En voici les résultats :

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 est au moins 5 fois plus rapide. Notez que nous "cassons" dès qu'un résultat est trouvé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X