Ошибка при завершении цикла

138
24 апреля 2019, 11:30

есть массив :

print_r($data['AdvertData']['subCategory']);
Array
(
[0] => Array
    (
        [seo] => dictaphones
        [id_category] => 124
        [title] => Диктофоны
    )
[1] => Array
    (
        [seo] => audio
        [id_category] => 122
        [title] => Аудио
    )
 )

я создаю новый массив и наполняю его пробегаясь по верхнему и обращаясь к ячейке [id_category]

$data['subSelects'] = array();
$mainCategory = $data['AdvertData']['mainCategory'];
$i = 0;           
foreach ($data['AdvertData']['subCategory'] as $k => $v) {
    $i++;
    $data['subSelects'][$i] = $this->app->AdvertsModel->Selects($mainCategory, $v['id_category']);
    $data['subSelects'][$i]['parent'] = $data['AdvertData']['subCategory'][$k++]['id_category'];
    $mainCategory = $data['AdvertData']['subCategory'][$k++]['id_category'];
}

где mainCategory исходый самый первый id который про мере прохождения цикла меняется. (как я понимаю) на последней итерации цикла выдается ошибка:

Notice: Undefined offset: 2 in

я не могу ее исправить, пробовал разные проверки существования или на пустоту последнего ключа массива ([$k++]) не моиогло...

Answer 1

$a++ Постфиксный инкремент Возвращает значение $a, затем увеличивает $a на единицу. http://php.net/manual/ru/language.operators.increment.php

Таким образом на первой итерации ваш пример превращается:

$k = 0 //из цикла foreach
$i = 1 // поскольку в первой строке цикла делаете инкремент $i++
// здесь $k++ возвращает 0, поскольку $k++ ПОСТинкрементный оератор
$data['subSelects'][1]['parent'] = $data['AdvertData']['subCategory'][0]['id_category'];
// после первого инкремента $k++ $k превращается в 1
$mainCategory = $data['AdvertData']['subCategory'][1]['id_category'];

ошибка вылетает на втором шаге цикла, поскольку:

$k = 1 //из цикла foreach
$i = 2 // поскольку в первой строке цикла делаете инкремент $i++
// здесь $k++ возвращает 1, поскольку $k++ ПОСТинкрементный оератор
$data['subSelects'][2]['parent'] = $data['AdvertData']['subCategory'][1]['id_category'];
// после инкремента $k++ в предыдущей строке $k превращается в 2 и вызывает ошибку
// Notice: Undefined offset: 2 in
$mainCategory = $data['AdvertData']['subCategory'][2]['id_category'];

Решение: как вам советовали в первом комментарии, не использовать $i, $i++, $k++, а везде вместо них подставить $k, поскольку она итак итерируется в цикле foreach

READ ALSO
Как связать по покупателю и самому товару цены и скидки?

Как связать по покупателю и самому товару цены и скидки?

Добрый день помогите выбрать добить модуль личных количественных скидок на каждого пользователя отдельно в ограниченном виде!

132
Таблицу HTML загрузить в таблицу БД MySQL

Таблицу HTML загрузить в таблицу БД MySQL

Имеется таблица HTML в которую заносятся данные из БДИ такая же таблица HTML на странице администратора только редактируемая

121
Привязать поля с разных массивов и фильтровать по значению первого, как это сделать?

Привязать поля с разных массивов и фильтровать по значению первого, как это сделать?

Добрый день как можно customer(пользователя) product_id(купленный товар айди) сравнить с product_id(всего интернет магазина) и по полю в cumtomer kolichestvo делать...

136
Удаление объекта из json на php

Удаление объекта из json на php

Мне надо удалить объект из jsonНапример, у меня есть вот такая json-запись: { "+79123456789": { "name":"name", "date":"date", "time":"time" } Как реализовать на php удаление...

149