2010-05-21 2 views
2

Я пытаюсь просмотреть массив записей (сотрудников), в этом цикле я вызываю функцию, которая возвращает другой массив записей (встречи для каждого сотрудника).Вопрос о области PHP

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

Это работает хорошо, однако, позже в сценарии, мне нужно Переберите записи, на этот раз делает использование назначения массивов, однако они недоступны.

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

Обычно, я бы выполнить функцию из первого цикла, в течение второй, однако этот цикл уже вложен в двух других, которые могли бы привести тот же SQL-запрос для запуска 168 раз.

Может ли кто-нибудь предложить обходной путь?

Любые советы были бы весьма полезными.

Благодаря

+0

Я предполагаю, что второй цикл встречается в той же функции, в которой происходит первый цикл? –

+0

Я не уверен, что понимаю. Циклы не имеют собственного объема. В какой момент вы теряете «штатных сотрудников» и почему? –

ответ

6

foreach перебирает в копию массива. Если вы хотите изменить значение, необходимо reference его:

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

Из документации:

Примечание: Если не ссылается массив, foreach работает на копии указанного массива а не сам массив. foreach имеет некоторые побочные эффекты для указателя массива. Не полагайтесь на указатель массива во время или после foreach без его перезагрузки.

и

По состоянию на PHP 5, вы можете легко изменять элементы массива в предшествующих $value с &. Это назначит reference вместо копирования значения.

+0

Я думаю, что это не связано с его вопросом. EDIT: хорошо, я думаю, что это то, что он имел в виду, а не действительно проблема. – Artefacto

+0

@Artefacto: В какой-то мере это связано с областью. Копия не видна за пределами цикла;) –

+0

Ну ... * последняя * копия '$ staffmember' * будет * видна вне цикла, так что это не проблема проблемы ... =) – deceze

Смежные вопросы