Здравствуйте, есть у меня 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, почему так - незнаю
Sort изменяет очерёдность элементов, при том что перебор идёт по числовому ключу.
Используйте внутренний указатель массива и уберите sort
.
for ($value = reset($object); $value !== false; $value = next($object)) {
$key = key($object);
# do something whith $value;
}
NOTE
На будущее - foreach
работает с копией массива, в нём исходный массив во время итерации менять бессмысленно.
Сделал так, как у Вас, 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);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я работаю с загрузкой фотографий, пытаюсь отображать миниатюры этих фотоДля изменения размера фотографий использую canvas
Что сделать, чтобы элемент Canvas не очищался при каждом новом шаге?
Все предлагают запоминать состояние в событиях mousedown, mouseup