Подтвердить что ты не робот

Удалить NULL, FALSE и '' - но не 0 - из массива PHP

Я хочу удалить значения NULL, FALSE и ''.

Я использовал array_filter, но он также удаляет 0.

Есть ли функция, которая делает то, что я хочу?

array(NULL,FALSE,'',0,1) -> array(0,1)
4b9b3361

Ответ 1

array_filter должен работать нормально, если вы используете identical оператор сравнения.

здесь пример

$values = [NULL, FALSE, '', 0, 1];

function myFilter($var){
  return ($var !== NULL && $var !== FALSE && $var !== '');
}

$res = array_filter($values, 'myFilter');

Или, если вы не хотите определять функцию фильтрации, вы также можете использовать анонимную функцию (закрытие):

$res = array_filter($values, function($value) {
    return ($value !== null && $value !== false && $value !== ''); 
});

Если вам нужны только числовые значения, вы можете использовать is_numeric как ваш обратный вызов: пример

$res = array_filter($values, 'is_numeric');

Ответ 2

Из http://php.net/manual/en/function.array-filter.php#111091:

Если вы хотите удалить NULL, FALSE и Empty Strings, но оставить значения 0, вы можете использовать strlen в качестве функции обратного вызова:

array_filter($array, 'strlen');

Ответ 3

array_filter не работает, потому что по умолчанию он удаляет все, что эквивалентно FALSE, а PHP считает 0 эквивалентным false. руководство по PHP имеет это сказать по этому вопросу:

При преобразовании в boolean следующие значения считаются FALSE:

  • сама логическая ЛОЖЬ
  • целое число 0 (ноль)
  • поплавок 0.0 (ноль)
  • пустая строка и строка "0"
  • массив с нулевыми элементами
  • объект с нулевыми переменными-членами (только для PHP 4)
  • специальный тип NULL (включая неустановленные переменные)
  • Объекты SimpleXML, созданные из пустых тегов

Каждое другое значение считается TRUE (включая любой ресурс).

Вы можете передать второй параметр array_filter с обратным вызовом к функции, которую вы пишете самостоятельно, которая сообщает array_filter, удалить или удалить элемент.

Предполагая, что вы хотите удалить все эквивалентные значения FALSE, кроме нулей, это простая функция для записи:

function RemoveFalseButNotZero($value) {
  return ($value || is_numeric($value));
}

Затем вы просто перезаписываете исходный массив фильтрованным массивом:

$array = array_filter($array, "RemoveFalseButNotZero");

Ответ 4

Использовать функцию обратного вызова с помощью array_filter. См. Этот пример, снятый с руководства PHP, о том, как использовать функции обратного вызова. Функция обратного вызова в примере фильтруется на основе нечетного/четного; вы можете написать небольшую функцию для фильтрации на основе ваших требований.

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

function even($var)
{
    // returns whether the input integer is even
    return(!($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
?> 

Ответ 5

Однострочники всегда приятны.

$clean_array = array_diff(array_map('trim', $my_array), array('', NULL, FALSE));

Объяснение:

  • 1-й параметр array_diff: Обрезанная версия $my_array. Используя array_map, окружающие пробелы обрезаются из каждого элемента с помощью функции trim. Хорошо использовать обрезанную версию, если элемент содержит строку, которая представляет собой ничто иное, как пробелы (например, вкладки, пробелы), которые, как я полагаю, также будут удалены. Вы можете так же легко использовать $my_array для 1-го параметра, если вы не хотите обрезать элементы.
  • 2-й параметр array_diff: Массив элементов, которые вы хотите удалить из $my_array.
  • Вывод: Массив элементов, которые содержатся в первом массиве, которые также не содержатся во втором массиве. В этом случае, поскольку '', NULL и FALSE находятся в пределах второго массива, они никогда не могут быть возвращены array_diff.

EDIT:

Оказывается, вам не нужно иметь NULL и FALSE во втором массиве. Вместо этого вы можете просто '', и он будет работать одинаково:

$clean_array = array_diff(array_map('trim', $my_array), array(''));

Ответ 6

проверьте, меньше ли 1 и больше -1, если затем не удалите его...

$arrayValue = (NULL,FALSE,'',0,1);
$newArray = array();
foreach($arrayValue as $value) {
    if(is_int($value) || ($value>-1 && $value <1)) {
        $newArray[] = $value;
    }
}

print_r($newArray);

Ответ 7

function my_filter($var)
{
    // returns values that are neither false nor null (but can be 0)
    return ($var !== false && $var !== null && $var !== '');
}

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => '',
             5 => 0
          );

print_r(array_filter($entry, 'my_filter'));

Выходы:

Array
(
    [0] => foo
    [2] => -1
    [5] => 0
)

Ответ 8

function ExtArray($linksArray){
    foreach ($linksArray as $key => $link)
    {
        if ($linksArray[$key] == '' || $linksArray[$key] == NULL || $linksArray[$key] == FALSE || $linksArray[$key] == '')
        {
            unset($linksArray[$key]);
        }else {
            return $linksArray[$key];
        }
    }
}

Эта функция может помочь вам

Ответ 9

array_filter - это функция, которая решит вашу проблему...

Для получения дополнительной информации см. эту ссылку → http://php.net/manual/en/function.array-filter.php