Некоторые элементы в моем массиве являются пустыми строками, основанными на том, что отправил пользователь. Мне нужно удалить эти элементы. У меня есть это:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Но это не работает. $linksArray
все еще имеет пустые элементы. Я также пытался сделать это с помощью empty()
функции, но результат тот же.
Ответы:
Поскольку вы имеете дело с массивом строк, вы можете просто использовать
array_filter()
, что удобно для вас:Имейте в виду, что если обратный вызов не предоставлен , все записи массива, равные
FALSE
(см. Преобразование в логическое значение ), будут удалены. Поэтому, если вам нужно сохранить элементы, которые являются точной строкой'0'
, вам понадобится специальный обратный вызов:источник
array_filter
следует удалить пустые элементы. И если в PHP определение empty не совпадает с вашим определением, вы можете заполнить опцию обратного вызова анонимной функцией, которая выбрасывает нежелательные элементы. Очевидно, у вас должен быть php 5.3 или более поздней версии, чтобы использовать анонимные обратные вызовы. stackoverflow.com/questions/2412299/…false
элементы. ( php.net/manual/en/function.array-filter.php )a
второго раза просто сбрасывает первый.Вы можете использовать
array_filter
для удаления пустых элементов:Если у вас есть
(int) 0
в вашем массиве, вы можете использовать следующее:РЕДАКТИРОВАТЬ: Может быть, ваши элементы не пустые как таковые, но содержат один или несколько пробелов ... Вы можете использовать следующее перед использованием
array_filter
источник
scalar
элементы в вашем массиве, да. В противном случае вы не можете этого сделать.function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map()
сделал магию, потому что у меня были пробелы в этих пустых массивах!Самый популярный ответ на эту тему абсолютно НЕПРАВИЛЬНЫЙ.
Рассмотрим следующий PHP-скрипт:
Почему это? Поскольку строка, содержащая один символ «0», также имеет логическое значение false, поэтому, даже если она не является пустой строкой, она все равно будет отфильтрована. Это было бы ошибкой.
Передача встроенной функции strlen в качестве функции фильтрации будет работать, потому что она возвращает ненулевое целое число для непустой строки и нулевое целое число для пустой строки. Ненулевые целые всегда оцениваются в true при преобразовании в логическое значение, в то время как нулевые целые всегда оцениваются в false при преобразовании в логическое значение.
Итак, абсолютный, окончательный, правильный ответ:
источник
0
,""
,null
)strlen() expects parameter 1 to be string, array given
«Если обратный вызов не предоставлен, все записи ввода, равные FALSE, будут удалены». - http://php.net/manual/en/function.array-filter.php
источник
источник
Вы можете просто сделать
array_filter: «Если обратный вызов не предоставлен, все записи ввода, равные FALSE, будут удалены». Это означает, что элементы со значениями NULL, 0, '0', '', FALSE, array () также будут удалены.
Другой вариант делает
который удалит элементы со значениями NULL, '' и FALSE.
Надеюсь это поможет :)
ОБНОВИТЬ
Вот пример.
Подводить итоги:
источник
источник
false
и0
. Учитывая, что это было опубликовано в ту же минуту, что и принятый ответ (это небезопасно и неверно), я могу только предположить, что ваши 8 голосов проголосовали по сравнению с принятым ответом 649, а последний - решение в одну строку.array_filter()
было бы более чистым подходом, чемforeach()
циклtrim()
, я бы порекомендовалif(is_string($link) && trim($link) === '')
Еще один вкладыш для удаления пустых ("" пустых строк) элементов из вашего массива.
Примечание: Этот код намеренно держит
null
,0
иfalse
элементы.Или, может быть, вы хотите сначала обрезать элементы массива:
Примечание: этот код также удаляет
null
иfalse
элементы.источник
Короче говоря:
Это мой предложенный код:
Объяснение:
Я думаю, что использование
array_filter
это хорошо, но не достаточно, потому что значения будут какspace
и\n
... держать в массиве, и это обычно плохо.Поэтому я предлагаю вам использовать смесь
array_filter
иarray_map
.array_map
предназначен для обрезки,array_filter
для удаления пустых значений,strlen
для сохранения0
значения иarray_values
для повторной индексации, если вам нужно.Образцы:
Результаты:
Онлайн тест:
http://phpio.net/s/5yg0
источник
Если вы работаете с числовым массивом и вам необходимо переиндексировать массив после удаления пустых элементов, используйте функцию array_values :
Также см .: PHP переиндексировать массив?
источник
Ответ с наибольшим количеством голосов является неправильным или, по крайней мере, не совсем верным, поскольку ОП говорит только о пустых строках. Вот подробное объяснение:
Что значит пустое ?
Прежде всего, мы должны договориться о том, что означает пустое . Вы хотите отфильтровать:
$element === false
)empty()
?Как вы фильтруете значения
Чтобы отфильтровать только пустые строки :
Чтобы отфильтровывать только строго ложные значения, вы должны использовать функцию обратного вызова :
Обратный вызов также полезен для любой комбинации, в которой вы хотите отфильтровать значения "falsey", кроме некоторых. (Например, отфильтруйте каждый
null
иfalse
т. Д., Оставив только0
):Третий и четвертый случай (для наших целей наконец) эквивалентны, и для этого все, что вам нужно использовать, это значение по умолчанию:
источник
null
иfalse
, но оставить 0, вы также можете использовать встроеннуюstrlen
функцию php в качестве обратного вызова.Я должен был сделать это, чтобы сохранить значение массива (строка) 0
источник
источник
Для многомерного массива
источник
источник
источник
Я использую следующий скрипт для удаления пустых элементов из массива
источник
Просто хочу внести альтернативу циклам ... также устранить пробелы в ключах ...
В моем случае я хотел сохранить последовательные ключи массива, когда операция была завершена (не просто нечетные числа, на которые я смотрел. Настройка кода для поиска нечетных ключей казалась мне хрупкой и не благоприятной для будущего).
Я искал что-то более похожее на это: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
Комбинация array_filter и array_slice делает свое дело.
$example = array_filter($example); $example = array_slice($example,0);
Никаких идей по эффективности или контрольным показателям, но это работает.
источник
вывод
источник
источник
Всего одна строка: обновление (спасибо @suther):
источник
используйте
array_filter
функцию для удаления пустых значений:источник
Удалить пустые элементы массива
оно работает!
источник
Согласно вашему методу, вы можете просто перехватить эти элементы в другом массиве и использовать его следующим образом:
источник
попробуйте это ** ** Пример
источник
Я думаю, что array_walk гораздо более подходит здесь
Вывод:
Мы также урезали пустые места из допустимых значений
Наконец, только (null), (Boolean False) и ('') будут считаться пустыми строками
Что касается
False
его нормально, потому что AFAIK пользователь не может отправлять логические значения.источник
С такими вещами гораздо лучше быть откровенным о том, что вы хотите, а чего не хотите.
Это поможет следующему парню не быть застигнутым врасплох поведением
array_filter()
без обратного вызова. Например, я остановился на этом вопросе, потому что я забыл,array_filter()
удаляетNULL
или нет. Я потратил впустую время, когда я мог только использовать решение ниже и иметь мой ответ.Кроме того, логика не зависит от языка в том смысле, что код может быть скопирован на другой язык без необходимости понимать поведение функции php, например,
array_filter
когда обратный вызов не передается.В моем решении с первого взгляда ясно, что происходит. Удалите условие для сохранения чего-либо или добавьте новое условие для фильтрации дополнительных значений.
Не обращайте внимания на фактическое использование,
array_filter()
поскольку я просто передаю ему собственный обратный вызов - вы можете пойти дальше и извлечь его из своей собственной функции, если хотите. Я просто использую это как сахар дляforeach
петли.Еще одним преимуществом этого подхода является то, что вы можете разбить фильтрующие предикаты на абстрактные функции, которые фильтруют одно значение для каждого массива и выстраиваются в составное решение.
Посмотрите этот пример и встроенные комментарии для вывода.
Теперь вы можете динамически создавать функцию
filterer()
с помощью using,pipe()
которая будет применять эти частично примененные функции для вас.источник