168 votes

Comment effectuer une recherche par clé=>valeur dans un tableau multidimensionnel en PHP

Existe-t-il un moyen rapide d'obtenir tous les sous-réseaux où une paire clé-valeur a été trouvée dans un tableau multidimensionnel ? Je ne peux pas dire quelle sera la profondeur du tableau.

Tableau d'exemples simples :

$arr = array(0 => array(id=>1,name=>"cat 1"),
             1 => array(id=>2,name=>"cat 2"),
             2 => array(id=>3,name=>"cat 1")
);

Lorsque je recherche key=name et value="cat 1", la fonction doit retourner :

array(0 => array(id=>1,name=>"cat 1"),
      1 => array(id=>3,name=>"cat 1")
);

Je suppose que la fonction doit être récursive pour descendre au niveau le plus profond.

2voto

Trevor Lettman Points 26

Il s'agit d'une fonction révisée de celle que John K. a postée... J'ai besoin de saisir uniquement la clé spécifique dans le tableau et rien au-dessus.

function search_array ( $array, $key, $value )
{
    $results = array();

    if ( is_array($array) )
    {
        if ( $array[$key] == $value )
        {
            $results[] = $array;
        } else {
            foreach ($array as $subarray) 
                $results = array_merge( $results, $this->search_array($subarray, $key, $value) );
        }
    }

    return $results;
}

$arr = array(0 => array(id=>1,name=>"cat 1"),
       1 => array(id=>2,name=>"cat 2"),
       2 => array(id=>3,name=>"cat 1"));

print_r(search_array($arr, 'name', 'cat 1'));

1voto

Darko Hrgovic Points 11

Et une autre version qui renvoie la valeur de la clé à partir de l'élément du tableau dans lequel la valeur est trouvée (pas de récursion, optimisé pour la vitesse) :

// if the array is 
$arr['apples'] = array('id' => 1);
$arr['oranges'] = array('id' => 2);

//then 
print_r(search_array($arr, 'id', 2);
// returns Array ( [oranges] => Array ( [id] => 2 ) ) 
// instead of Array ( [0] => Array ( [id] => 2 ) )

// search array for specific key = value
function search_array($array, $key, $value) {
  $return = array();   
  foreach ($array as $k=>$subarray){  
    if (isset($subarray[$key]) && $subarray[$key] == $value) {
      $return[$k] = $subarray;
      return $return;
    } 
  }
}

Merci à tous ceux qui ont posté ici.

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