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
Форумы портала PHP.SU :: Версия для печати :: Загвоздка при выводе из массива
Форумы портала PHP.SU » » Вопросы новичков » Загвоздка при выводе из массива

Страниц (1): [1]
 

1. Kledt - 28 Февраля, 2017 - 11:47:13 - перейти к сообщению
Добрый день вот код ниже, срабатывает так как и должно: Выводит результаты из массива, исключив из результата то Имя, которое хотим исключить.
PHP:
скопировать код в буфер обмена
  1. $out_data =  array("Алексей","Алексейка","Алёха","Лёха","Алёша","Лёша");
  2.  
  3. echo '<pre>'.print_r($result, true).'</pre>'; // Выводим весь массив для наглядности
  4.  
  5. $key = 1; // Хотим исключить Алексейка
  6.  
  7. foreach ($out_data as $ke => &$value) {
  8.         unset($out_data[$key]);    // Исключаем из вывода результат с ключом 1
  9. echo $value." Конюхов<br>";  // Выводим все значения из массива, исключив результат с ключом 1
  10. }


Результат - Алексейка Конюхов исключен:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Алексей
  3.     [1] => Алексейка
  4.     [2] => Алёха
  5.     [3] => Лёха
  6.     [4] => Алёша
  7.     [5] => Лёша
  8. )
  9. Алексей Конюхов
  10. Алёха Конюхов
  11. Лёха Конюхов
  12. Алёша Конюхов
  13. Лёша Конюхов


Но если мы хотим исключить самое первое значение, т.е. значение с ключом 0 (в данном случае Алексей), то вывод с исключением этой строки не срабатывает:

PHP:
скопировать код в буфер обмена
  1. $out_data =  array("Алексей","Алексейка","Алёха","Лёха","Алёша","Лёша");
  2.  
  3. echo '<pre>'.print_r($result, true).'</pre>'; // Выводим весь массив
  4.  
  5. $key = 0; // Хотим исключить Алексей
  6.  
  7. foreach ($out_data as $ke => &$value) {
  8.         unset($out_data[$key]);    // Исключаем из вывода результат с ключом 0
  9. echo $value." Конюхов<br>";  // Выводим все значинения из массива, исключив результат с ключом 0
  10. }


Результат - Алексей Конюхов НЕ исключился:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Алексей
  3.     [1] => Алексейка
  4.     [2] => Алёха
  5.     [3] => Лёха
  6.     [4] => Алёша
  7.     [5] => Лёша
  8. )
  9. Алексей Конюхов
  10. Алексейка Конюхов
  11. Алёха Конюхов
  12. Лёха Конюхов
  13. Алёша Конюхов
  14. Лёша Конюхов


В чем загвоздка? Почему не исключается значение "Алексей Конюхов" во втором примере?
2. Sail - 28 Февраля, 2017 - 12:18:53 - перейти к сообщению
Kledt, из массива оно исключается. Из вывода - нет, потому что выводится значение переменной $value.
unset() выполняется после отработки заголовка цикла foreach. Следовательно, при удалении из массива его первого элемента, его значение доступно через переменную $value.
В качестве альтернативы можно использовать сравнение $key и $ke для принятия решения о выводе значения $value и/или удалении элемента массива функцией unset().
Ещё стоит подумать о необходимости использования ссылки на элемент массива в заголовке цикла foreach.
3. Kledt - 28 Февраля, 2017 - 16:50:14 - перейти к сообщению
Sail, вот поменял метод вывода из массива. Если исключать любое имя из массива кроме 0 (Алексей), то отрабатывает как надо. Но опять же если исключать нулевой элемент (Алексей), то само значение теперь удаляется при выводе, но остается ненужное "Конюхов". Со всеми остальными элементами кроме нулевого - функция удаляет при выводе все значение "Имя+Конюхов", для этого и использую ссылку на элемент массива в заголовке цикла foreach.

PHP:
скопировать код в буфер обмена
  1. $out_data =  array("Алексей","Алексейка","Алёха","Лёха","Алёша","Лёша");
  2.  
  3. echo '<pre>'.print_r($out_data, true).'</pre>';
  4.  
  5. $key = 0; // Хотим исключить Алексей
  6. foreach ($out_data as $ke => &$value) {
  7.         unset($out_data[$key]);    // Исключаем из вывода результат с ключом 0
  8.         echo $out_data[$ke]." Конюхов<br>";  // Выводим все значинения из массива, исключив результат с ключом 0
  9. }


Результат:
Цитата:
Array
(
[0] => Алексей
[1] => Алексейка
[2] => Алёха
[3] => Лёха
[4] => Алёша
[5] => Лёша
)
Конюхов
Алексейка Конюхов
Алёха Конюхов
Лёха Конюхов
Алёша Конюхов
Лёша Конюхов
4. Мелкий - 28 Февраля, 2017 - 17:09:22 - перейти к сообщению
Проверьте свой error_reporting. В последнем примере должен быть E_NOTICE за обращение к несуществующему (уже удалённому) элементу массива.

Для пропуска итерации обычно используется условие с последующим continue. Менять массив при обходе этого самого массива может давать неожиданные результаты. Например, использование передачи по значению вместо передачи по ссылке поведение кода внезапно меняет. И я, кстати, весьма удивился, что первый пример идентично ведёт себя и в 5 и в 7 версиях.
5. Строитель - 28 Февраля, 2017 - 17:16:49 - перейти к сообщению
Мелкий пишет:
В последнем примере должен быть E_NOTICE за обращение к несуществующему (уже удалённому) элементу массива.
Так и есть.

Kledt, а какую цель вы преследуете? Я так понимаю, что вам надо найти и удалить какое-то значение в массиве, и после - распечатать этот массив в браузере?
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $out_data =  array("Алексей","Алексейка","Алёха","Лёха","Алёша","Лёша");
  4. $del = 'Алексей'; // Хотим исключить Алексей
  5.  
  6. if (($key = array_search($del, $out_data)) !== false) {
  7.     unset($out_data[$key]);
  8. }
  9.  
  10. foreach ($out_data as $value) {
  11.     // Выводим все значинения из массива
  12.     echo $value ." Конюхов\n";
  13. }
6. Kledt - 28 Февраля, 2017 - 17:36:50 - перейти к сообщению
Строитель пишет:
Kledt, а какую цель вы преследуете? Я так понимаю, что вам надо найти и удалить какое-то значение в массиве, и после - распечатать этот массив в браузере?


Да, именно так. Вообще свой пример упростил до одномерного массива для наглядности. Задача была найти в многомерном массиве значение (Имя) и вывести в браузер все производные этого Имени с приставкой "Фамилия", исключив при этом в выводе само искомое Имя.
Ваш код работает как надо. Всем спасибо.

 

Powered by ExBB FM 1.0 RC1