массивы — PHP Удаление пустых элементов из объекта
У меня есть следующий объект, здесь напечатан в виде массива. Этот объект построен из запроса SOAP.
Что я хочу сделать, это удалить все пустые элементы и быть возвращенным с этим объектом
редактировать
Объект AdminInfo как JSON:
Решение
Требования: рекурсивно сканировать вложенные массивы, удаляя пустые ветви / элементы.
Это еще одна «прогулка по дереву».
Единственная «хитрая» часть — позволить обработке выше по дереву узнать, добавлять ли текущий элемент в выходное дерево или нет.
Функция, которая обрабатывает узел, вернет массив, который имеет флаг «сохранить значение», а также значение, которое нужно сохранить.
Другие решения
После небольшого скручивания головы я придумал рекурсивную функцию, которая, как я предлагал ранее, преобразует объект в массив, чтобы проверить, установлены ли переменные в нуль.
Если все переменные внутри этого объекта равны нулю, родительский объект индексируется, чтобы установить ссылку на объект равной нулю.
Я пытался объяснить и документировать код как можно лучше.
Пожалуйста, не просто скопируйте код и покончите с ним, а прочитайте его и попробуйте изучить код, который я предоставил.
Рекурсивная функция будет довольно сложной, поскольку вы не просто хотите удалить нулевые переменные, но удалите все, что содержит только нулевые переменные.
Вот пример без рекурсии, которая просто удаляет null переменные из object :
Как удалить пустые элементы в массиве вместе с ключами?
unset удаляет только значение, а я хочу удалить еще и ключи. Что использовать для этого? Также хотелось бы узнать функцию, которая удалит все это дело полностью сама, без циклов, думаю, что такая есть, не так ли?
6 ответов 6
Зашел посмотреть на решение достаточно насущной проблемы. Беглым взглядом окинул топик и увидел, что нормального решения пока нет. Сочинил следующее:
Не изящно, но очень просто и, главное, работает 🙂
В зависимости от того, что считается «пустым» элементом, можно еще такой вариант предложить:
Хотелось бы отметить что далеко не всегда такого кода достаточно:
Например так мы например можем нарваться на неприятности:
На выходе мы получим
Хотя на самом то деле хотели получить
По этому для таких случаев используем:
И все, ключей пустых нет.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками массивы php или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.17.40238
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как удалить элемент массива в PHP?
Одним из мощнейших инструментов PHP-разработчика являются массивы. Если вы работали с массивами в других языках программирования (Delphi, Fortrain, C++), то помните, что везде массив надо объявлять, указывая размерность и тип элементов. В PHP всё обстоит иначе.
Дело в том, что в PHP массив не является линейным объектом. Это, по сути, хеш-массив, представляющий собой набор пар — ключей с их значениями.
Теперь давайте посмотрим, как удалять элементы из хеш-массива в PHP. В вышеупомянутых языках программирования для таких действий придётся создавать специальный объект, односвязный либо 2-связный список, бережно выделять и освобождать память, наблюдать за восстановлением связей в списке. Что касается PHP, то тут весь необходимый «менеджмент» спрятан, но всегда готов к применению.
1. Удаляем элемент массива в PHP
Чтобы удалить элемент в PHP, достаточно всего лишь знать его ключ — в таком случае удаление будет сведено к вызову функции unset() :
2. Как удалить 1-й элемент массива?
В нашем случае 1-й элемент удаляется, а элемент 5 => ‘b’, попадает под перенумерацию. Что касается элементов со строковыми ключами, то их перенумерация не затронет.
3. Как удалить последний элемент массива?
После удаления последнего элемента массива в PHP перенумерация оставшихся элементов не выполняется.
4. Как удалить пустые элементы из массива?
Итак, мы в цикле проверим каждый элемент массива, используя функцию empty() и удалим пустые элементы. Здесь важно понять, что строковый скаляр ‘0’ — тоже пустой элемент. А вот ’00’ пустым не является.
Очевидно, что данный способ более гибок.
5. Удаляем повторяющиеся элементы массива в PHP
Порой возникает необходимость удалить повторяющиеся элементы массива в PHP. Для решения этой задачи существует специальная функция под названием array_unique() :
Из кода видно, что функция удалила из PHP-массива повторяющиеся элементы. При этом функция имеет ещё один параметр, указывающий, как сравнивать элементы.
Возможные типы сравнения: • SORT_REGULAR — сравнение без преобразования типа элементов; • SORT_STRING — сравнение как строки; • SORT_NUMERIC — сравнение как чисел (пытаемся преобразовать в число); • SORT_LOCALE_STRING — сравнение как строки, но с учётом выбранного набора символов.
По умолчанию применяется SORT_STRING. Выбирая типы сравнения, помните, что это важно. Давайте изменим тип в прошлом примере на SORT_NUMERIC:
Во время сравнения все элементы массива были преобразованы к численному типу скаляра. В нашем случае это неизменно давало значение ноль, в результате чего у нас остался лишь первый элемент.
Хотите знать о PHP больше? Записывайтесь на курс «Backend-разработчик на PHP»!
Удаление пустых элементов массива
некоторые элементы в мой массив являются пустыми строками на основе того, что пользователь представил. Мне нужно удалить эти элементы. У меня есть это:
25 ответов:
можно использовать array_filter удалить пустые элементы:
если у вас (int) 0 в вашем массиве, вы можете использовать следующее:
EDIT: возможно, ваши элементы не пусты сами по себе, но содержат один или несколько пробелов. Вы можете использовать следующее Перед использованием array_filter
самый популярный ответ на эту тему абсолютно неверен.
рассмотрим следующий PHP-скрипт:
почему это? Поскольку строка, содержащая один символ ‘0’, также вычисляется как логическое значение false, поэтому, даже если это не пустая строка, она все равно будет отфильтрована. Это было бы ошибкой.
передача встроенной функции strlen в качестве функции фильтрации будет работать, поскольку она возвращает ненулевое целое число для непустой строки, и нулевое целое число для пустой строки. Ненулевых целых чисел всегда возвращать true при преобразовании в boolean, А нуль целых возвращают false при преобразовании в boolean.
Итак, абсолютный, окончательный, правильный ответ:
array_filter: «если обратный вызов не предоставляется, все записи ввода, равные FALSE, будут удалены.»Это означает, что элементы со значениями NULL, 0, ‘0’,», FALSE, array() также будут удалены.
другой вариант делает
который удалит элементы со значениями NULL, » и FALSE.
надеюсь, что это помогает 🙂
обновление
еще один лайнер для удаления пустых («»пустая строка) элементов из массива.
Примечание: этот код намеренно сохраняет нулевые, 0 и ложные элементы.
или, может быть, вы хотите сначала обрезать элементы массива:
Примечание: этот код также удаляет null и false элементы.
Если вы работаете с числовым массивом и необходимо повторно индексировать массив после удаления пустых элементов, используйте array_values функция:
самый проголосовавший ответ неправильно или, по крайней мере, не совсем верно, поскольку OP говорит только о пустых строках. Вот подробное объяснение:
Что значит пустой в смысле?
прежде всего, мы должны договориться о том, что пустой средства. Вы хотите отфильтровать:
array_filter
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
array_filter — Фильтрует элементы массива с помощью callback-функции
Описание
Список параметров
Возвращаемые значения
Возвращает отфильтрованный массив.
Список изменений
Примеры
Пример #1 Пример использования array_filter()
Результат выполнения данного примера:
Результат выполнения данного примера:
Пример #3 array_filter() с указанным mode
Результат выполнения данного примера:
Примечания
Если callback-функция изменяет массив (например, добавляет или удаляет элементы), поведение этой функции неопределённо.
Смотрите также
User Contributed Notes 5 notes
If you like me have some trouble understanding example #1 due to the bitwise operator (&) used, here is an explanation.
The part in question is this callback function:
45 in binary: 101101
1 in binary: 000001
——
result: 000001
Some of PHP’s array functions play a prominent role in so called functional programming languages, where they show up under a slightly different name:
The array functions mentioned above allow you compose new functions on arrays.
This leads to a style of programming that looks much like algebra, e.g. the Bird/Meertens formalism.
E.g. a mathematician might state
map(f o g) = map(f) o map(g)
the so called «loop fusion» law.
Many functions on arrays can be created by the use of the foldr() function (which works like foldl, but eating up array elements from the right).
I can’t get into detail here, I just wanted to provide a hint about where this stuff also shows up and the theory behind it.
My favourite use of this function is converting a string to an array, trimming each line and removing empty lines:
Depending on the intended meanings of your «empty» array values, e.g., null and empty string, vs. an integer 0 or a boolean false, be mindful of the result of different filters.
declare( strict_types = 1 );
array (size=3)
‘intzero’ => int 0
‘stringzero’ => string ‘0’ (length=1)
‘stringfalse’ => string ‘false’ (length=5)
array (size=5)
‘nullstring’ => string » (length=0)
‘intzero’ => int 0
‘stringzero’ => string ‘0’ (length=1)
‘false’ => boolean false
‘stringfalse’ => string ‘false’ (length=5)
array (size=4)
‘intzero’ => int 0
‘stringzero’ => string ‘0’ (length=1)
‘false’ => boolean false
‘stringfalse’ => string ‘false’ (length=5)


