PHP foreach внутри foreach заполняет массив записью из предыдущей итерации

#php #arrays

Вопрос:

Поэтому я получаю данные из api и хочу сохранить результаты в массиве. Но в результатах есть некоторые массивы внутри них, и эти данные я хочу повторить и добавить в массив.

Это работает для повторения результатов, а также массива результатов, но когда я хочу сохранить данные внутри БД, например, первые данные внутреннего массива отлично сохраняются внутри родительского результата, но вторая запись получает данные первого внутреннего массива, а вторая и третья получают первый и второй и так далее. Я думаю, что я делаю что-то не так с циклами или должен очищать массив после каждой итерации, но тогда я получаю только последнюю запись внутреннего массива в конце…

Итак, это выглядит так:

 foreach($results as $result) {
  // add data e.g. inside DB
  foreach($result->inner as $inner) {
    $inner_fields[] = [
      'field_2312312' => $inner->name,
      'field_3345343' => $inner->desc
    ];
    //add data from inner_fields inside the new db entry
  }
}
 

Почему данные из первой итерации $inner также сохраняются в данных второй итерации?

Комментарии:

1. Не уверен, что с предоставленным кодом, но, возможно, после foreach($results as $result) { этого $inner_fields = []; . Вам нужно показать, что на самом деле представляет собой //добавление данных из внутренних полей внутри новой записи БД .

2. Показать образец ввода и вывода данных… было бы полезно! — как в вашем $results json или что-то в этом роде… и ваш результат.

3. @AbraCadaver на самом деле это решение! Я добавил инициализацию массива внутри внешнего цикла, и теперь все работает правильно. Большое вам спасибо!

4. @AbraCadaver, Может быть, вы можете опубликовать это в качестве ответа, чтобы я мог отметить его как правильный. Еще раз спасибо!

Ответ №1:

Трудно сказать без предоставленного кода, так как неизвестно, что вы используете в //добавить данные из внутренних полей внутри новой записи БД. Однако, если вы используете массив там, вам нужно сбросить/очистить его:

 foreach($results as $result) {
    $inner_fields = [];

    foreach($result->inner as $inner) {
        $inner_fields[] = ['field_2312312' => $inner->name,
                           'field_3345343' => $inner->desc
                          ];
        //add data from inner_fields inside the new db entry
    }
}
 

Комментарии:

1. Как сказано в комментариях, это то решение, которое мне было нужно. Я не предоставил точный код, потому что он очень специфичен для системы управления контентом, которую я использую (добавление записей в БД), но вкратце: у меня есть несколько полей в каждой записи БД, созданной внешним циклом, которые заполняются внутренним циклом. Я знал, что это проблема с циклами, поэтому я сократил приведенный выше код до этого. Большое вам спасибо!