2014-06-05 4 views
0

Voici mon code:PHP in_array() ne passera pas if ... else

$convertTitle = $this->art->catList(); // gets an array which has other arrays as its values 
    foreach($convertTitle as $cT){ // cycle through the smaller arrays 
     if(in_array($cat, $cT)){ // if "xx" is found in a smaller array 
      $data['title'] = $cT['full']; // set the $title to the full form corresponding to the abbreviated xx ($cat) 
     } 
     if(!in_array($cat, $cT)){ 
      $data['title'] = "Sorry, an error occurred."; // if it's not found, choose an alternate title 
      $data['error'] = 1; // throw the error 
     } 
    } 

Pour debug, j'ai l'impression a été in_array($cat, $cT) et quand je pense à, il délivre en sortie 1. Lorsque Je m'y attends, ça sort aussi 0. Donc, il semble que ça fonctionne. Je peux même print($data['title']); et le titre correct apparaît! Mais indépendamment du fait que in_array() sorte 1 ou 0, ma seconde instruction if écrase toujours la première et l'erreur I $ sort toujours 1. Qu'est-ce qui donne?

Quelques solutions que j'ai essayé:

if(!in_array($cat, $cT)... 
if(in_array($cat, $cT) == false/0/null)... 
else... 

Je ne sais vraiment pas pourquoi il ne sort le titre propre lorsque le titre est situé dans la variable quand je veux que ce soit!

EDIT: est ici print_r($convertTitle);

Array ([0] => Array ([handle] => dr [full] => Drawings) [1] => Array ([handle] => f [full] => Films & Stills) [2] => Array ([handle] => pa [full] => Paintings) [3] => Array ([handle] => ph [full] => Photography) [4] => Array ([handle] => po [full] => Portraits)) 
+1

Vous devriez probablement juste utiliser une instruction 'else' au lieu d'une autre' if' car vos chemins de code * devraient * s'exclure mutuellement. Aussi, pouvez-vous inclure quelques exemples de '$ cat 'et' $ cT'? –

+0

Montre moi 'print_r ($ convertTitle);'. Savez-vous que vous pouvez utiliser 'if (...) {...} else {...}'? – mleko

+0

J'ai essayé ça et ça n'a toujours pas fonctionné. – SanguineEpitaph

Répondre

3

Pourquoi pas seulement un else?

if (in_array()) { 
    ... 
} else { 
    ... 
} 

Il est essentiellement inutile d'avoir deux tests séparés si() lorsque les conditions sont contraires booléennes de l'autre.

De plus, rappelez-vous que votre foreach() va itérer de nombreux articles. Pour TOUS les éléments qui n'appartiennent pas à votre tableau, vous devez définir $error comme VRAI. Mais alors vous ne réinitialisez pas cela à FALSE quand vous faites une correspondance. si

array item #1 -> not found, so error => true 
array item #2 -> not found, so error => true 
array item #3 -> found! -> don't change error, it's still true 
array item .... 
etc... 
+0

Cela n'a pas fonctionné, cependant. – SanguineEpitaph

+0

@SanguineEpitaph Pensez au dernier exemple de Marc. Je pense que vous avez un problème de logique au lieu d'un problème 'in_array'. – steven

+2

J'aime ces commentaires "ça ne marche pas". – georg

0

Vous écrasez vos valeurs dans chaque itération de la boucle foreach, de sorte que vous finirez avec le résultat de la dernière valeur pour la title et votre error reste réglé une fois qu'il est réglé.

En dehors de cela, vous devriez probablement écrire:

if (in_array()) { 

} else { 

} 
0

Merci pour les réponses! J'ai oublié que la boucle serait encore et encore après avoir trouvé la bonne entrée. Pour référence future, voici le code qui fonctionne:

$convertTitle = $this->art->catList(); 
    foreach($convertTitle as $cT){ 
     if(in_array($cat, $cT)){ 
      $data['title'] = $cT['full']; 
      $data['error'] = 0; 
      break; 
     } 
     else{ 
      $data['title'] = "Sorry, an error occurred."; 
      $data['error'] = 1; 
     } 
    }