web-dev-qa-db-fra.com

PHP: Vérifier si la valeur et la clé existent dans un tableau multidimensionnel

Je me demandais si vous pouviez me donner un coup de main avec ceci:

J'ai un tableau multidimensionnel ...

$my_array = array(    
        0 =>  array(  
            "name"   => "john",  
            "id"    =>  4  
        ),  
        1   =>  array(  
            "name" =>  "mark",  
            "id" => 152  
        ), 
    2   =>  array(  
            "name" =>  "Eduard",  
            "id" => 152  
        )
);

Toute idée de ce qui serait le moyen le plus rapide et le plus efficace de vérifier si le tableau $ my_array contient une valeur quelconque avec la clé "id" et sa valeur 152. Je n'ai pas besoin de faire écho ni d'utiliser aucune des valeurs. Je dois juste vérifier (renvoyer vrai) si le tableau contient des enregistrements avec l'ID "clé" et la valeur "152".

54
Rob

Rien ne sera plus rapide qu'une simple boucle. Vous pouvez combiner certaines fonctions de tableau pour le faire, mais elles seront également implémentées en tant que boucle.

function whatever($array, $key, $val) {
    foreach ($array as $item)
        if (isset($item[$key]) && $item[$key] == $val)
            return true;
    return false;
}
63
Dan Grossman

Voici une version mise à jour de la réponse de Dan Grossman qui tiendra compte des tableaux multidimensionnels (ce que j'étais après):

function find_key_value($array, $key, $val)
{
    foreach ($array as $item)
    {
        if (is_array($item) && find_key_value($item, $key, $val)) return true;

        if (isset($item[$key]) && $item[$key] == $val) return true;
    }

    return false;
}
20
Friendly Code

** PHP> = 5.5

tu peux simplement utiliser ça

$key = array_search(40489, array_column($userdb, 'uid'));

Supposons ce tableau multidimensionnel:

$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'
    )
);

$key = array_search(40489, array_column($userdb, 'uid'));
10
Manuel Pardo

Si vous devez effectuer beaucoup de recherches "id" et que cela devrait être très rapide, vous devriez utiliser un second tableau contenant tous les "ids" comme clés:

$lookup_array=array();

foreach($my_array as $arr){
    $lookup_array[$arr['id']]=1;
}

Vous pouvez maintenant rechercher très rapidement un identifiant existant, par exemple:

echo (isset($lookup_array[152]))?'yes':'no';
8
stewe

Comme dans votre question, qui est en réalité un simple tableau à deux dimensions, ne serait-il pas préférable? Regarde-

Supposons que votre nom de tableau 2D $ $ my_array et la valeur à rechercher sont $ id

function idExists($needle='', $haystack=array()){
    //now go through each internal array
    foreach ($haystack as $item) {
        if ($item['id']===$needle) {
            return true;
        }
    }
    return false;
}

et pour l'appeler:

idExists($id, $my_array);

Comme vous pouvez le constater, il ne vérifie en fait que si votre index $ interne contient uniquement $ id. Certaines autres réponses ici peuvent également donner la valeur true si nom_clé a également $ value

4
Anant
return 0 < count(
    array_filter(
        $my_array,
        function ($a) {
            return array_key_exists('id', $a) && $a['id'] == 152;
        }
    )
);

Remarque: l'appel array_key_exists est facultatif. Il se prête simplement à la rusticité.

2
amphetamachine

Une bonne solution peut être celle fournie par @Elias Van Ootegan dans un commentaire qui est:

$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";

J'ai essayé et travaillé pour moi, merci mon pote.

Edité

Note: Cela fonctionnera dans PHP 5.5+

1
Imran Qamer

Essayez avec ce code ci-dessous. Cela devrait fonctionner correctement pour tout type de recherche multidimensionnelle.

Ici vous pouvez voir EXEMPLE DE DEMO EN DIRECT

function multi_array_search($search_for, $search_in) {
    foreach ($search_in as $element) {
        if ( ($element === $search_for) ){
            return true;
        }elseif(is_array($element)){
            $result = multi_array_search($search_for, $element);
            if($result == true)
                return true;
        }
    }
    return false;
}
1
Faisal
function checkMultiArrayValue($array) {
        global $test;
        foreach ($array as $key => $item) {

            if(!empty($item) && is_array($item)) {
                checkMultiArrayValue($item);
            }else {
                if($item)
                 $test[$key] = $item;

            }
        }
        return $test;   
    }

 $multiArray = array(    
                0 =>  array(  
                      "country"   => "",  
                      "price"    => 4,  
                      "discount-price" => 0,  
               ),);

$test = checkMultiArrayValue($multiArray);
echo "<pre>"
print_r($test);

Retourne un tableau qui a un index et une valeur

0
nageen nayak

J'ai écrit la fonction suivante afin de déterminer si un tableau multidimensionnel contient partiellement une certaine valeur.

function findKeyValue ($array, $needle, $value, $found = false){
    foreach ($array as $key => $item){
        // Navigate through the array completely.
        if (is_array($item)){
            $found = $this->findKeyValue($item, $needle, $value, $found);
        }

        // If the item is a node, verify if the value of the node contains
        // the given search parameter. E.G.: 'value' <=> 'This contains the value'
        if ( ! empty($key) && $key == $needle && strpos($item, $value) !== false){
            return true;
        }
    }

    return $found;
}

Appelez la fonction comme ceci:

$this->findKeyValue($array, $key, $value);
0
Guillaume Zeeman

La manière la plus simple est la suivante:

$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);

if (array_search(152, array_column($my_array, 'id')) !== FALSE)
  echo 'FOUND!';
else
  echo 'NOT FOUND!';
0
Jazzer

Utilisez un array_map ()

$ options est le tableau dans lequel vous recherchez.

$arr = array_map(function($ar) {
    if(array_key_exists('name_of_the_key_you_search_for',$ar)){
        return true;
    }else{
        return false;
    }
},$options  );
var_dump($arr); //just for test, remove in the code
0
Rangel Nikolov