PHP-изменить текущий объект в цикле foreach



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



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



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

2 ответов:

есть 2 способа сделать это

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

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

или

foreach($questions as &$question){

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

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

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

конечно, с помощью array_map и при использовании контейнера реализации 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);

vs

<?php

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

если вы знаете, что вы у вас никогда не будет проблем с изменяемостью (имея в виду, если вы намерены перезаписать $arr ты всегда могла!--7--> и будьте откровенны.

Comments

    Ничего не найдено.