2013-05-18 2 views
0

J'ai ce tableau:Recherche dans un tableau

$fruits = array(
    [0] => array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), 
    [1] => array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'), 
    [2] => array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere') 
    ) 

Comment puis-je savoir si le tableau $fruits contient déjà apple en elle? J'ai essayé: in_array("apple", $fruits) et cela n'a pas fonctionné.

J'ai également essayé diverses syntaxe et ai foiré un peu avec array_key_exists(), mais rien n'a fonctionné. Des idées?

+0

vous pouvez utiliser 'in_array();' –

+0

J'ai essayé in_array(), je crois que la meilleure solution pour que toutes les réponses que je reçois est une boucle foreach .. – Mustapha

+0

caisse ma réponse. J'ai utilisé 'foreach()' et 'in_array()' –

Répondre

3

PHP est notoirement lourd dans de tels cas. Le meilleur tout autour de la solution est un simple foreach:

$found = false; 
foreach ($fruits as $fruit) { 
    if ($fruit['name'] == 'apple') { 
     $found = true; 
     break; 
    } 
} 

if ($found) .... 

Vous pouvez écrire dans un certain nombre de façons plus sexy, mais tous exigera l'allocation de mémoire supplémentaire et/ou sera plus lent; bon nombre d'entre eux seront également plus difficiles à comprendre si vous n'avez pas beaucoup d'expérience.

+0

@PeeHaa 埽 Non, il n'avait pas, le code a absolument raison? – bwoebi

+0

Cela ne fonctionnera que si vous savez quel sera le nom de la dernière clé. Que faire si le tableau avait 1000 clés de niveau supérieur et que vous vouliez voir si quelque part il contenait «orange». Si le nom était «mandarine» et que la couleur était «orange», ce code le manquerait. Le tableau est structuré. $ fruits [0] ['nom'] == apple. Si vous ne passez pas par [0,1,2 ... etc] cela ne fonctionnera pas car la première boucle foreach ne fait qu' itérer sur la première clé avec une clé définie après celle-ci. –

+0

@Unipartisandev: Je n'ai aucune idée de ce dont vous parlez. La question aborde la recherche de fruits * par leur nom *. Nous ne nous soucions pas des autres clés. – Jon

0

Essayez ceci:

<?PHP 


function in_array_r($needle, $haystack, $strict = false) { 
    foreach ($haystack as $item) { 
     if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) { 
      return true; 
     } 
    } 

    return false; 
} 

$b = array(array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'),array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere')); 
echo in_array_r("apple", $b) ? 'found' : 'not found'; 

?> 

Codepad Demo>>

1
foreach($fruits as $fruit) 
{ 
    /*In first loop $fruit = array('name'=>'banana', 'color'=>'yellow' , 
     'shape'=>'cylinder') 
    */ 
    if(in_array("apple",$fruit)) 
    { 
     /*Using in_array() function we don't have to worry about array keys. 
     The function checks whether the value exists in given array. 
     Returns TRUE if value is found in the array, FALSE otherwise. 
     if(in_array("apple",$fruit)) checks for TRUE 
     */ 

     //Do something 
    } 
} 

in_array(): http://php.net/manual/en/function.in-array.php
foreach(): http://php.net/manual/en/control-structures.foreach.php

+0

Pourriez-vous s'il vous plaît expliquer votre code? – Fabio

+0

Je l'ai testé et cela fonctionne. Il est plus court que le code de ma réponse et itéré sur plusieurs niveaux de clés contrairement aux autres réponses. –

+0

@Fabio: Avoir mis à jour la solution avec des explications. Si vous avez encore des doutes je suis heureux d'aider –

1
$hasApple = false; 
foreach ($fruits as $subArray) { 
    if ($subArray['name'] == "apple") 
     $hasApple = true; 
} 

Ceci est la solution normale, simple Vous pouvez également essayer avec array_map($fruits, function() use (&$hasApple) { /* ... */ }). (Mais cela peut être plus lent ...)

PHP 5.5 il y a une seule ligne possible:

$hasApple = in_array("apple", array_column($fruits, "name")); 
+0

+1 pour 'array_column', mais avec un avertissement géant: vous feriez mieux d'être sûr que ce n'est pas un grand tableau, parce que vous allez payer pour la commodité d'une ligne avec une meilleure lisibilité du sang. ;-) – Jon

+0

@Jon Pour les petits tableaux, array_column est environ 3 fois plus lent, mais pour les grands tableaux seulement 2 fois (je l'ai simplement comparé ...) – bwoebi

+0

@Jon 'php bench_array_column_in_array.php => array_column: 243 secs foreach : 122 secs' avec un tableau de 3 millions d'entrées et en boucle 100 fois (et l'utilisation de la mémoire est la taille maximale de la matrice) – bwoebi

1
<?php 

$fruits = array(
    array('name'=>'banana', 'color'=>'yellow' , 'shape'=>'cylinder'), 
    array('name'=>'apple', 'color'=>'red' , 'shape'=>'sphere'), 
    array('name'=>'orange', 'color'=>'orange' , 'shape'=>'sphere') 
); 

$result = false; 

foreach($fruits as $subarray) { 
    if(in_array('apple', $subarray)) { 
     $result = true; 
     break; 
    } 
} 

echo "result is ", ($result ? "TRUE" : "FALSE"); 

?> 
+0

Et si vous recherchez l'orange, mais la pomme a la couleur orange? –

+0

Il retourne 'true'. La question principale était de trouver n'importe quel _apple_ dans le tableau pour ne pas trouver l'élément dont le nom est _apple_. – furas

0
$hasapple = 0; 
foreach($fruits as $keynum) 
{ 
    foreach($keynum as $fruitinfokey => $value) 
     { 
     if($value == "apple") 
      { 
      echo "fruits contains " . $value; 
      $hasapple = 1; 
      } 
} 
} 

if($hasapple == 0) 
    { 
    echo "The array $fruits does not contain apple"; 
    } 

Mettez une boucle foreach à l'intérieur d'une autre boucle foreach pour la recherche grâce à des clés étendues.

0
function arraySearch($value, $array) { 
     foreach ($array as $key => $val) { 
      if ($val['name'] === $value) { 
       return true; 
      } 
     } 
     return null; 
    } 

if(arraySearch('apple',$fruits)){ 
    echo "yes found"; 
}else{ 
    echo "not found"; 
} 
+0

C'est bon, mais si je voulais rechercher une couleur? Vous devriez éditer la fonction. Faites-en ceci: function arraySearch ($ value, $ array, $ type = 'nom') ... alors if ($ val [$ type] === $ valeur –

+0

non vous pouvez passer un autre argument dans la fonction arraySearch ($ value, $ array, $ type) et vérifiez la condition avec if ($ val [$ type] === $ value) –

+0

C'est exactement ce que j'ai dit, sauf que j'ai $ type avec une valeur par défaut, ce qui n'est pas une nécessité. –

Questions connexes