Некоторые элементы в моем массиве являются пустыми строками в зависимости от того, что отправил пользователь. Мне нужно удалить эти элементы. У меня есть следующее:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Но это не работает. $linksArray
по-прежнему содержит пустые элементы. Я также попробовал сделать это с помощью функции empty()
, но результат тот же.
Поскольку вы имеете дело с массивом строк, вы можете просто использовать array_filter()
, который удобно обработает все это за вас:
print_r(array_filter($linksArray));
Помните, что если обратный вызов не указан, все элементы массива, равные FALSE
(см. converting to boolean), будут удалены. Поэтому если вам нужно сохранить элементы, которые являются точной строкой '0'
, вам понадобится пользовательский обратный вызов:
// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));
// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));
Вы можете использовать array_filter
удалить пустые элементы:
$emptyRemoved = array_filter($linksArray);
Если у вас есть `(инт) 0 в вашем массиве, вы можете использовать следующее:
$emptyRemoved = remove_empty($linksArray);
function remove_empty($array) {
return array_filter($array, '_remove_empty_internal');
}
function _remove_empty_internal($value) {
return !empty($value) || $value === 0;
}
Редактировать: может быть, ваши элементы не пустые как таковой, но содержат одну или несколько пробелов... можно использовать следующие перед использованием array_filter
$trimmedArray = array_map('trim', $linksArray);
Самый популярный ответ на эту тему-это абсолютно неправильно.
Рассмотрим следующий PHP-скрипт:
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
Почему это? Потому что строка, содержащая один '0' характер также возвращает логическое значение false, так что даже если это's не пустая строка, это все равно фильтруются. Это было бы ошибкой.
Проходя встроенную функцию strlen как функция фильтрации будет работать, потому что он возвращает ненулевое целое число для непустую строку, и ноль целых пустой. Ненулевых целых чисел всегда возвращать true при преобразовании в boolean, А нуль целых возвращают false при преобразовании в boolean.
Итак, абсолютный, окончательный, правильный ответ:
$arr = array_filter($arr, 'strlen');
$linksArray = array_filter($linksArray);
"Если обратный вызов не поставлен, все записи ввода, равные FALSE, будут удалены." -- http://php.net/manual/en/function.array-filter.php
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values
Вы можете просто сделать
array_filter($array)
array_filter: "Если обратный вызов поступает, все элементы входного сигнала равен false будут удалены.&и" Это означает, что элементы с значениями null, 0, '0', '', ложные, массив() тоже будут удалены.
Другой вариант-это делать
array_diff($array, array(''))
которая позволит удалить элемент со значениями null, '' и ложным.
Надеюсь, что это помогает :)
Обновление # # ##
Вот пример.
$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())
Подведем итоги:
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
Еще один лайнер для удаления пустых (" и на" пустая строка) элементы из массива.
$array = array_filter($array, function($a) {return $a !== "";});
Примечание: этот код сознательно держит нуль
, 0
и false
элементов.
Или может быть, вы хотите сначала подстригите элементов массива:
$array = array_filter($array, function($a) {
return trim($a) !== "";
});
Примечание: этот код также удаляет нуль
и false
элементов.
Это мой предложенный код:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
Я думаю использовать array_filter-это хорошо, но недостаточно, потому что значения, как пространство
и \N
,... сохранить в массиве и обычно это плохо.
Поэтому я предлагаю вам использовать array_filter смеси и
использование array_map`.
использование array_map для обрезки,
array_filterдля удаления пустых значений,
функция strlenза собой
0` значение, и array_values для повторной индексации, если вам нужно.
Образцы###:
$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");
// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);
// "a"
$new2 = array_filter(array_map('trim', $myarray));
// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');
// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
var_dump($new1, $new2, $new3, $new4);
Результаты###:
array(5) {
[0]=>
" string(1) "
[1]=>
string(1) "
"
[2]=>
string(2) "
"
[4]=>
string(1) " "
[6]=>
string(1) "a"
}
array(1) {
[6]=>
string(1) "a"
}
array(2) {
[5]=>
string(1) "0"
[6]=>
string(1) "a"
}
array(2) {
[0]=>
string(1) "0"
[1]=>
string(1) "a"
}
Если вы работаете с численный массив и нужно переиндексировать массив после удаления пустых элементов, используйте array_values функция:
array_values(array_filter($array));
См. также: https://stackoverflow.com/questions/7558022/php-reindex-array
Большинство проголосовало ответ не так или, по крайней мере, не совсем так, как ОП говорит только о пустой строки. Здесь'ы подробное объяснение:
Прежде всего, мы должны договориться о том, что пусто средства. Вы хотите отфильтровать:
$элемент === ложь
)пустая функция ()
?Чтобы отфильтровать пустые строки только:
$filtered = array_diff($originalArray, array(""));
Только отфильтровать строго ложное значения, вы должны использовать обратный вызов функция:
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
Этот метод также полезен для любой комбинации, в которой вы хотите отфильтровать в "falsey" и значения, за исключением некоторых. (Например, фильтра каждые нуль
и false
, и т. д., оставляя только 0
):
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
Третий и четвертый корпуса (для наших целей в прошлом) эквивалентны, а для этого вы должны использовать значение по умолчанию:
$filtered = array_filter($originalArray);
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
function trim_array($Array)
{
foreach ($Array as $value) {
if(trim($value) === '') {
$index = array_search($value, $Array);
unset($Array[$index]);
}
}
return $Array;
}
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
Просто хочу внести свой вклад альтернатива петель...также для устранения пробелов в ключи...
В моем случае я хотел, чтобы держать последовательные ключи массива, когда операция была завершена (а не только нечетные числа, что я смотрел на. Настройка код, чтобы выглядеть так же для нечетных ключей, казалось хрупким для меня, а не будущего.)
Я искал что-то вроде этого: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
Сочетание array_filter и array_slice делает трюк.
$пример = array_filter($пример); $пример = array_slice($примеру,0);
Понятия не имею об эффективности или критериев, но это работает.
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");
foreach ($my as $key => $value) {
if (is_null($value)) unset($my[$key]);
}
foreach ($my as $key => $value) {
echo $key . ':' . $value . '<br>';
}
результат _
1:5
2:6