2010-05-21 8 views
2

J'essaie de regarder à travers un tableau d'enregistrements (membres du personnel), dans cette boucle, j'appelle une fonction qui renvoie un autre tableau d'enregistrements (rendez-vous pour chaque membre du personnel).PHP portée question

foreach($staffmembers as $staffmember) 
{ 
     $staffmember['appointments'] = get_staffmember_appointments_for_day($staffmember); 
     // print_r($staffmember['appointments'] works fine 
} 

Cela fonctionne bien, cependant, plus tard dans le script, je dois faire une boucle à travers les dossiers, cette fois en utilisant des tableaux de rendez-vous, mais ils ne sont pas disponibles.

foreach ($staffmembers as $staffmember) 
{                
     //do some other stuff 
     //print_r($staffmember['appointments'] no longer does anything 
} 

Normalement, je remplirait la fonction de la première boucle, dans la seconde, mais cette boucle est déjà imbriqué dans deux autres, qui provoqueraient la même requête SQL à exécuter 168 fois.

Quelqu'un peut-il suggérer une solution de contournement?

Un conseil serait grandement apprécié.

Merci

+0

Je suppose que la deuxième boucle se produit dans la même fonction dans laquelle la première boucle se produit? –

+0

Je ne suis pas sûr de comprendre. Les boucles n'ont pas leur propre portée. À quel moment perdez-vous des «membres du personnel» et pourquoi? –

Répondre

6

foreach itère sur une copie du tableau. Si vous voulez changer la valeur, vous devez reference il:

foreach($staffmembers as &$staffmember) // <-- note the & 
{ 
    $staffmember['appointments'] = get_staffmember_appointments_for_day($staffmember); 
    // print_r($staffmember['appointments'] works fine 
} 

De la documentation:

Note: À moins que le tableau est référencé, foreach fonctionne sur une copie du tableau spécifié et pas le tableau lui-même. foreach a des effets secondaires sur le pointeur de tableau. Ne comptez pas sur le pointeur de tableau pendant ou après le foreach sans le réinitialiser.

et

PHP 5, on peut facilement modifier les éléments de la matrice en faisant précéder $value avec &. Cela affectera reference au lieu de copier la valeur.

+0

Je pense que ce n'est pas lié à sa question. EDIT: ok, je pense que c'est ce qu'il voulait dire, pas vraiment une question de cadrage, vraiment. – Artefacto

+0

@Artefacto: Il est lié à la portée d'une manière. La copie n'est pas visible en dehors de la boucle;) –

+0

Eh bien ... la * dernière * copie de '$ staffmember' * sera * visible en dehors de la boucle, donc ce n'est pas vraiment un problème de portée ... =) – deceze