PHP – изменение текущего объекта в цикле foreach

Мне было интересно, можно ли отредактировать текущий объект, который обрабатывается в цикле foreach

Я работаю с массивом объектов $questions и я хочу пройти и искать ответы, связанные с этим объектом вопроса, в моем db. Поэтому для каждого вопроса отправляйте объекты ответа и обновляйте текущий $question внутри моего цикла foreach чтобы я мог выводить / обрабатывать в другом месте.

 foreach($questions as $question){ $question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']); } 

Solutions Collecting From Web of "PHP – изменение текущего объекта в цикле foreach"

Есть два способа сделать это

  foreach($questions as $key => $question){ $questions[$key]['answers'] = $answers_model->get_answers_by_question_id($question['question_id']); } 

Таким образом вы сохраняете ключ, чтобы его можно было обновить снова в главной переменной $questions

или

 foreach($questions as &$question){ 

Добавление & будет содержать обновленные $questions -ные $questions . Но я бы сказал, что первая рекомендуется, даже если это короче (см. Комментарий Paystey)

В документации PHP foreach :

Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено по ссылке.

Разумеется, использование array_map и использование контейнера, реализующего ArrayAccess для получения объектов, – это более ArrayAccess , семантический способ сделать это?

Семантика карты массива похожа на большинство языков и реализаций, которые я видел. Он предназначен для возврата модифицированного массива на основе элемента входного массива (высокий уровень игнорирования предпочтений языка компиляции / времени выполнения); цикл предназначен для выполнения большей логики.

Для извлечения объектов по ID / PK, в зависимости от того, используете ли вы SQL или нет (кажется, это рекомендуется), я бы использовал фильтр, чтобы убедиться, что я получаю массив действительных PK, затем вставляю запятую и помещаю в SQL IN() , чтобы вернуть результат. Он делает один вызов вместо нескольких через SQL, оптимизируя бит цикла call->wait . Самое главное, мой код хорошо читал бы кого-то с любого языка с определенной степенью компетентности, и мы не сталкивались с проблемами мутируемости.

 <?php $arr = [0,1,2,3,4]; $arr2 = array_map(function($value) { return is_int($value) ? $value*2 : $value; }, $arr); var_dump($arr); var_dump($arr2); 

против

 <?php $arr = [0,1,2,3,4]; foreach($arr as $i => $item) { $arr[$i] = is_int($item) ? $item * 2 : $item; } var_dump($arr); 

Если вы знаете, что вы делаете, у вас никогда не будет проблем с мутацией (имея в виду, если вы намереваетесь перезаписать $arr вы всегда можете $arr = array_map и быть явным.