Удалить пустые элементы массива
У меня есть массив, в котором некоторые элементы представляют собой пустые строки, введённые пользователями. После выполнения следующего кода в массиве $linksArray
по-прежнему остаются пустые элементы:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Функция empty()
тоже не работает. Как мне правильно удалить пустые элементы из массива?
5 ответ(ов)
Самый популярный ответ на эту тему абсолютно НЕКОРРЕКТЕН.
Рассмотрим следующий скрипт на PHP:
<?php
$arr = array('1', '', '2', '3', '0');
// Некорректно:
print_r(array_filter($arr));
// Корректно:
print_r(array_filter($arr, 'strlen'));
Почему это так? Дело в том, что строка, содержащая единственный символ '0', также оценивается как логическое значение false. Таким образом, даже несмотря на то, что это не пустая строка, она будет отфильтрована. Это является ошибкой.
Передавая встроенную функцию strlen в качестве функции фильтрации, мы получаем правильный результат, поскольку она возвращает ненулевое целое число для непустой строки и нулевое целое число для пустой строки. Ненулевые целые числа всегда оцениваются как true при преобразовании в логическое значение, в то время как нулевые целые числа всегда оцениваются как false.
Таким образом, абсолютный, окончательный, правильный ответ заключается в том, что необходимо использовать:
$arr = array_filter($arr, 'strlen');
В данном коде $linksArray = array_filter($linksArray);
функция array_filter
используется для удаления всех элементов массива $linksArray
, которые равны FALSE
. Если не передан коллбэк, функция автоматически считает логическое значение элементов.
Согласно документации PHP, "Если не предоставлен коллбэк, все элементы входного массива, равные FALSE, будут удалены" (источник: http://php.net/manual/en/function.array-filter.php). Это значит, что после выполнения этой строки кода, в массиве останутся только элементы с истинными значениями.
В вашем коде вы используете функцию array_filter
в различных контекстах, и это действительно может вызвать путаницу.
Первый вызов:
$myarray = array_filter($myarray, 'strlen'); // удаляет элементы с "null" значением, но оставляет "0"
В этом случае функция array_filter
принимает второй параметр — функцию обратного вызова strlen
, которая возвращает длину строки. В результате, если элемент равен 0
(или пустой строке), strlen
вернет 0
, и этот элемент будет удалён из массива, так как 0
является значением "ложь" в PHP. Однако нулевые значения не являются "null" в PHP, и потому 0
останется в массиве.
Второй вызов:
$myarray = array_filter($myarray); // удаляет все значения "null"
Здесь вы вызываете array_filter
без второго параметра. В этом случае функция по умолчанию удаляет все элементы массива, которые приводятся к false
, включая null
, 0
, пустые строки и false
. Таким образом, если вы хотите удалить все элементы, включая "0", используйте этот вариант.
Если вам нужно сохранить "0" в массиве, но удалять другие ложные значения (например, null
, false
, и пустые строки), вы можете использовать функцию array_filter
с strlen
в качестве обратного вызова. Если же необходимо убрать все ложные значения (включая "0"), просто используйте array_filter
без второго параметра.
Надеюсь, это помогло прояснить ситуацию!
Вы можете просто использовать
array_filter($array)
Функция array_filter
: "Если обратный вызов не предоставлен, все элементы входного массива, равные FALSE, будут удалены". Это означает, что элементы со значениями NULL, 0, '0', '', FALSE, array() также будут удалены.
Другой вариант — это сделать
array_diff($array, array(''))
что удалит элементы со значениями NULL, '' и FALSE.
Надеюсь, это поможет 😃
ОБНОВЛЕНИЕ
Вот пример.
$a = array(0, '0', NULL, FALSE, '', array());
var_dump(array_filter($a));
// array()
var_dump(array_diff($a, array(0))); // 0 / '0'
// array(NULL, FALSE, '', array());
var_dump(array_diff($a, array(NULL))); // NULL / FALSE / ''
// array(0, '0', array())
В итоге:
- 0 или '0' удалят 0 и '0'
- NULL, FALSE или '' удалят NULL, FALSE и ''
Ваш код на PHP корректно удаляет пустые элементы из массива $linksArray
. Однако, подход с использованием foreach
и unset
может быть не самым эффективным. Вместо этого, вы можете использовать функцию array_filter
, чтобы избавиться от пустых значений более лаконично и эффективно. Вот пример вашего кода с использованием array_filter
:
$linksArray = array_filter($linksArray);
print_r($linksArray);
Функция array_filter
создаёт новый массив, в который попадают только те значения, которые не являются пустыми (т.е. не равны false
, null
, пустой строке и т.д.). Таким образом, этот способ более удобен и читаем.
Как проверить, содержит ли строка конкретное слово?
Сортировка двумерного массива по значению в столбце
Преобразование 'ArrayList<String>' в 'String[]' в Java
Функции startsWith() и endsWith() в PHP
В чем разница между строками в одинарных и двойных кавычках в PHP?