Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Загвоздка при выводе из массива
Но если мы хотим исключить самое первое значение, т.е. значение с ключом 0 (в данном случае Алексей), то вывод с исключением этой строки не срабатывает:
В чем загвоздка? Почему не исключается значение "Алексей Конюхов" во втором примере?
Sail
Отправлено: 28 Февраля, 2017 - 12:18:53
Участник
Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014
Помог: 57 раз(а)
Kledt, из массива оно исключается. Из вывода - нет, потому что выводится значение переменной $value.
unset() выполняется после отработки заголовка цикла foreach. Следовательно, при удалении из массива его первого элемента, его значение доступно через переменную $value.
В качестве альтернативы можно использовать сравнение $key и $ke для принятия решения о выводе значения $value и/или удалении элемента массива функцией unset().
Ещё стоит подумать о необходимости использования ссылки на элемент массива в заголовке цикла foreach.
Kledt
Отправлено: 28 Февраля, 2017 - 16:50:14
Новичок
Покинул форум
Сообщений всего: 5
Дата рег-ции: Дек. 2013
Помог: 0 раз(а)
Sail, вот поменял метод вывода из массива. Если исключать любое имя из массива кроме 0 (Алексей), то отрабатывает как надо. Но опять же если исключать нулевой элемент (Алексей), то само значение теперь удаляется при выводе, но остается ненужное "Конюхов". Со всеми остальными элементами кроме нулевого - функция удаляет при выводе все значение "Имя+Конюхов", для этого и использую ссылку на элемент массива в заголовке цикла foreach.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Проверьте свой error_reporting. В последнем примере должен быть E_NOTICE за обращение к несуществующему (уже удалённому) элементу массива.
Для пропуска итерации обычно используется условие с последующим continue. Менять массив при обходе этого самого массива может давать неожиданные результаты. Например, использование передачи по значению вместо передачи по ссылке поведение кода внезапно меняет. И я, кстати, весьма удивился, что первый пример идентично ведёт себя и в 5 и в 7 версиях.
----- PostgreSQL DBA
Строитель
Отправлено: 28 Февраля, 2017 - 17:16:49
Участник
Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014 Откуда: Украина
Помог: 74 раз(а)
Мелкий пишет:
В последнем примере должен быть E_NOTICE за обращение к несуществующему (уже удалённому) элементу массива.
Так и есть.
Kledt, а какую цель вы преследуете? Я так понимаю, что вам надо найти и удалить какое-то значение в массиве, и после - распечатать этот массив в браузере?
Покинул форум
Сообщений всего: 5
Дата рег-ции: Дек. 2013
Помог: 0 раз(а)
Строитель пишет:
Kledt, а какую цель вы преследуете? Я так понимаю, что вам надо найти и удалить какое-то значение в массиве, и после - распечатать этот массив в браузере?
Да, именно так. Вообще свой пример упростил до одномерного массива для наглядности. Задача была найти в многомерном массиве значение (Имя) и вывести в браузер все производные этого Имени с приставкой "Фамилия", исключив при этом в выводе само искомое Имя.
Ваш код работает как надо. Всем спасибо.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.