Проблема с unset(), php

294
14 января 2017, 14:36

Здравствуйте, есть у меня 2 массива. Первый - комплексы, второй - объекты этих комплексов. Для того чтобы вывести их сгрупированнимы использую такую схему.

foreach ($complex as $com) { //запускаем цикл по комплексам
  echo '<h2 align="center">Complex: ' . $com['name'] . '</h2>'; // выводим название комплекса
  for ($i = 0; $i <= count($object) - 1; $i++) { // запускаем цикл по обьектам
    echo 'Прохожение массив' . $i . ' ';
    if ($com['id'] == $object[$i]['complex_id']) { //проверка, на то, обьект етого комплекса или нет
      echo 'Object: ' . $object[$i]['name'] . '<br>'; // если да то выводим
      //unset($object[$i]);
      //sort($object);
    }
  }
}

Работает нормально, но проблема в том, что по такой схеме очень много данных проходит через цикл for. Получается что сколько обьектов - столько раз будет пройден цикл for у каждого комплекса отдельно.

Решил попробовать использовать функцию unset();. Если в цикле for проверка на обьект этого комплекса проходит, т.е. выводится название объекта - echo 'Object: ' . $object[$i]['name'] . Тогда применять unset();

if ($com['id'] == $object[$i]['complex_id']) { 
  echo 'Object: ' . $object[$i]['name'] . '<br>'; 
  unset($object[$i]);
  sort($object);
}

Но проблема в том, что не корректно работает. Если есть только 1 объект в комплексе - работает ОК, если 2 объекта - тогда показывает только 1 объект, если 3 объекта - тогда показывает 2 , но если 4 объекта - всеравно показывает 2 объекта, и так далее.. НЕ могу понять почему?

Результат прохождения по циклу без UNSET

Теперь с UNSET, почему так - незнаю

Answer 1

Sort изменяет очерёдность элементов, при том что перебор идёт по числовому ключу. Используйте внутренний указатель массива и уберите sort.

for ($value = reset($object); $value !== false; $value = next($object)) {
    $key = key($object);
    # do something whith $value;
}

NOTE

На будущее - foreach работает с копией массива, в нём исходный массив во время итерации менять бессмысленно.

Answer 2

Сделал так, как у Вас, unset не работает - все равно не меняется количество "заходов" в массив - echo 'Зашел в массив'.'
';

for ($value = reset($object); $value !== false; $value = next($object)) {
                           $key = key($object);
                           echo 'Зашел в массив'.'<br>';
                            if ($com['id'] == $value['complex_id']) {
                                echo 'Object: ' . $value['name'] . '<br>'; // если да то выводим
                                unset($value);
                            }
                  }
READ ALSO
Нарисовать изображение на весь Canvas

Нарисовать изображение на весь Canvas

Я работаю с загрузкой фотографий, пытаюсь отображать миниатюры этих фотоДля изменения размера фотографий использую canvas

380
Отключение очистки Canvas в WebGL

Отключение очистки Canvas в WebGL

Что сделать, чтобы элемент Canvas не очищался при каждом новом шаге?

396
Как получить состояние кнопки мышки в mouseover?

Как получить состояние кнопки мышки в mouseover?

Все предлагают запоминать состояние в событиях mousedown, mouseup

285
Не работает блок &ldquo;Поделиться&rdquo; корректно

Не работает блок “Поделиться” корректно

Вставила блок на странице сайта http://wwwsuperkot

256