2010-12-15 54 views
0

Je reçois la clé d'une valeur donnée dans un tableau multidimensionnel. Cela fonctionne bien, sauf que je ne peux pas accéder à la variable depuis OUTSIDE la boucle foreach imbriquée que j'utilise pour obtenir la clé.Variable d'accès depuis une instruction foreach imbriquée PHP

donc ma boucle foreach est la suivante: ($ name_books est le tableau multi-d qui contient 3 tableaux plus petits)

foreach($name_books as $test) { 
    foreach ($test as $key => $value) { 
    $book_code = array_search($row['name'],$test); 
    echo $book_code; //just to see if it works, which it does 
    break; 
     } 
    } 
//But then if I go outside of the loop.. 

echo $book_code." is the book code"; // <--DOES NOT WORK 

donc je sais que je fais face à des questions de portée des variables ici et j'ai essayé déclarer des globals à l'intérieur de la boucle foreach mais rien ne fonctionne.

Je suis sûr qu'il y a quelque chose d'absurdement simple qui me manque!

EDIT:

urg..I a fait un pas en arrière et a réalisé quelque chose d'autre, tout cela se passe dans une boucle while (obtenir des choses à partir d'un db)

de sorte que le code est plus comme: Excusez-moi de ne pas l'avoir fait, je me concentrais sur cette petite pièce et j'ai oublié de sauvegarder et de voir où elle allait.

Répondre

2

Ceci n'a rien à voir avec la portée variable tant que ce que vous avez posté est exactement ce que vous avez dans votre script.

Je pense que le problème est que vous ne faites que sortir de la boucle interne. À chaque itération de la boucle externe, $ book_code sera modifié, vous devez donc également arrêter la boucle externe. Essayez de changer break; en break 2; et de voir si cela résout votre problème. Cela le fait sortir de la boucle interne et de la boucle externe.

Editer: Je pense que vous pouvez également simplifier votre code:

foreach ($name_books as $test) { 
    $book_code = array_search($row['name'], $test); 
    if ($book_code !== FALSE) { 
     break; 
    } 
}
Si j'en savais plus sur votre structure, cela pourrait éventuellement être réduit à une seule instruction SQL et à 0 boucle.

+0

Vous tapez beaucoup plus vite que moi et a obtenu votre réponse en premier. – labue

+0

merci pour cela, je n'avais jamais utilisé autre chose que la pause par défaut avant. Cependant, j'ai oublié que je n'avais pas inclus toute l'image !! (désolé!) voir ma modification ci-dessus. – dijon

+0

C'était tout, merci! Je suis encore un peu confus quant à pourquoi cela a fonctionné alors que le mien n'a pas - je vais l'étudier un peu plus longtemps. Mais merci beaucoup pour l'aide. – dijon

5
break; 

Quittera uniquement le foreach imbriqué interne. S'il y a plus de lignes dans $name_books, il continuera à boucler et finalement à écraser $book_code avec les valeurs 'false' de array_search;

Une fois que vous avez trouvé la valeur que vous cherchez, utilisez:

break 2; 

En ce qui concerne votre édition, où vous cassez dépend de ce que vous faites avec la valeur que vous avez trouvé pour $book_code. Si vous ne prévoyez pas de continuer, modifiez le paramètre break. break 3; quittera également la boucle while. Changez la valeur en fonction du niveau d'imbrication.

+0

Je ne savais pas pause accepté un paramètre; On dirait que j'ai appris quelque chose de nouveau aujourd'hui. – Craige

+0

C'est aussi une nouvelle pour moi. Bon post. – Dutchie432

+0

excellent, merci pour l'info sur la rupture. – dijon

1

simshaun a raison, mais j'aborderais une approche différente.

Je vérifierais l'existence de $ book_code dans mes boucles foreach plutôt que de traiter les ruptures.

Nouveau Code

foreach($name_books as $test) { 
    foreach ($test as $key => $value) { 
     if(!isset($book_code)){ 
      $book_code = array_search($row['name'],$test); 
      echo $book_code; //just to see if it works, which it does 
     } 
    } 
} 

echo $book_code." is the book code"; 
+1

Je ne suis pas d'accord. Ne pas sortir des deux boucles signifie qu'il doit finir de parcourir les tableaux inutilement. Bien que, de façon réaliste, l'efficacité ne soit pas perceptible à moins que les réseaux ne soient très grands, la rupture des boucles est de loin plus efficace. – simshaun

+0

J'ai négligé certaines informations cruciales! voir ma modification ci-dessus. – dijon