Вопрос по foreach, arrays, object, php – PHP - изменить текущий объект в цикле foreach

95

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

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

<code>foreach($questions as $question){
    $question['answers'] = $answers_model->get_answers_by_question_id($question['question_id']);
}
</code>
Как и ArtjomKurapov, и @topener предположили, что я искал «передать по ссылке»; используя & amp; знак. Спасибо, ребята :) хорошего дня Garbit
@Гарбит потрясающий. Не могли бы вы отметить мой ответ как лучший, если он вам помог? Rene Pot
как насчет ссылок? Artjom Kurapov

Ваш Ответ

2   ответа
5

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);

против

<?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 и быть явным.

Гораздо более интуитивно понятный, чем выполнение foreach - это именно то, для чего предназначена эта функция.
172

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

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

или же

foreach($questions as &$question){

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

вPHPforeach documentation:

In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned by reference.

@Paystey Можете ли вы привести свои источники или дать подробное объяснение?
Почему манипулирование ссылками было бы небезопасно? Является ли C / C ++ где вы должны манипулировать ссылками везде небезопасно? Вы должны сделать это безопасным или нет, а не язык.
Ницца! так что & amp; знак пройдет по ссылке? это правильная терминология? Garbit
@BabyAzerty: Пэйстей не сказал "ссылки" в целом ", но вforeachПо поводу ужаса вот так:stackoverflow.com/questions/3307409/… (@Nico, FYI тоже.)
Ссылки вforeach действительно не рекомендуется, какforeach передача значения в цикле приводит к непредсказуемому поведению. Это может быть дольше, но вы намного безопаснее, используя способ 1 здесь.

Похожие вопросы