web-dev-qa-db-fra.com

Vérifier si une valeur existe dans un tableau multidimensionnel en utilisant array_search et array_column ne renvoyant pas les valeurs de Array [0]

Je dois vérifier si une valeur existe dans un tableau multidimensionnel. J'ai trouvé cet exemple sur Stackoverflow et sur PHP.NET que j'aime bien car c'est une solution élégante et compacte, mais j'ai remarqué un comportement étrange:

$userdb=Array
(
(0) => Array
    (
        (uid) => '100',
        (name) => 'Sandra Shush',
        (pic_square) => 'urlof100'
    ),

(1) => Array
    (
        (uid) => '5465',
        (name) => 'Stefanie Mcmohn',
        (pic_square) => 'urlof100'
    ),

(2) => Array
    (
        (uid) => '40489',
        (name) => 'Michael',
        (pic_square) => 'urlof40489'
    )
);



if(array_search(100, array_column($userdb, 'uid'))) {
    echo "FOUND";
}

L'instruction IF ne renvoie aucune valeur si vous vérifiez l'existence d'une valeur du tableau FIRST (Array [0]). Cela fonctionne avec les valeurs des autres tableaux. Essayez d'abord avec 100, puis essayez avec 40489 (ou essayez avec un "nom" ou un "pic_square").

19
Nicero

Vous pouvez utiliser in_array() comme ci-dessous: -

<?php
$userdb=Array
(
'0' => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'url' => 'urlof100'
    ),

'1' => Array
    (
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    ),

'2' => Array
    (
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )
);
print_r(array_column($userdb, 'uid')); 
if(in_array(100, array_column($userdb, 'uid'))) { // search value in the array
    echo "FOUND";
}
?>

Résultat: - https://eval.in/1058147

Remarque: - votre code fonctionnera également si vous modifiez votre comparaison comme ci-dessous: -

if(array_search(100, array_column($userdb, 'uid')) !== False) {
    echo "FOUND";
} else {
    echo "Not Found";
}

à travers le manuel: - http://php.net/manual/en/function.array-search.php

Il déclare: - 

Retourne la clé d'aiguille si elle est trouvée dans le tableau, FALSE sinon.

php traité 0 comme false et 1 comme true lorsqu'il s'agit de la valeur renvoyée par une fonction C'est pourquoi votre code échoue car votre code renvoie 0.

40
Alive to Die

En effet, array_search renvoie la clé, qui dans ce cas est 0, ce qui équivaut à false. Vous devez faire une comparaison stricte, à savoir:

if (false !== array_search(100, array_column($userdb, 'uid'))) {
    ...  
}

Vois ici

3
billyonecan

C'est parce que votre valeur 100 est dans le premier index 0, donc si la condition échoue. Au lieu de cela, comparez strictement avec false:

DEMO

if(array_search(100, array_column($userdb, 'uid')) !== False) {
    echo "FOUND";
} else {
    echo "Not Found";
}

Pour cette instance, il est préférable d'utiliser in_array, car vous vérifiez simplement si l'élément est dans un tableau ou non. Utilisez, array_search si vous voulez récupérer l'index de l'élément. 

3
Thamilan

Vous pouvez essayer ceci:

$res1 =Array
(
'0' => Array
    (
        'uid' => '100',
        'name' => 'Sandra Shush',
        'url' => 'urlof100'
    ),

'1' => Array
    (
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    )
);

$res2 =Array
(
'0' => Array
    (
        'uid' => '40489',
        'name' => 'Michael',
        'pic_square' => 'urlof40489'
    )

'1' => Array
    (
        'uid' => '5465',
        'name' => 'Stefanie Mcmohn',
        'pic_square' => 'urlof100'
    )
);

foreach ($res1 as $key=>$item1)
{
    $val=$item1['uid'];
    foreach ($res2 as $key2=>$item2)
    {
          if ($item2['uid'] == $val)
           {
                //value 5465 found
           }
    }
}
0
Ranjith R