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

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

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

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

 array(NULL,FALSE,'',0,1) -> array(0,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'); 

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

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

 array_filter($array, 'strlen'); 

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

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

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

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

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

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

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

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

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

Используйте функцию обратного вызова с помощью 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")); ?> 

Однострочники всегда хороши.

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

Объяснение:

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

РЕДАКТИРОВАТЬ:

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

 $clean_array = array_diff(array_map('trim', $my_array), array('')); 
 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 ) 

проверьте, меньше ли 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); 
 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]; } } } с 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]; } } } 

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

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

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