Array_filter и пустой()

Предупреждение: array_filter() ожидает, что параметр 2 будет допустимым обратным вызовом, функция «пустая» не найдена или недопустимое имя функции....

Почему empty считается недопустимым обратным вызовом?

$arr = array_filter($arr, 'empty');

Это работает: if(empty($arr['foo'])) die();


person Alex    schedule 06.12.2011    source источник


Ответы (5)


Отвечать

empty() — это не функция, а языковая конструкция, и array_filter() может принимать функцию только как его обратный вызов.

Это дано в виде небольшого примечания на странице руководства:

Примечание. Поскольку это языковая конструкция, а не функция, ее нельзя вызвать с помощью функции переменных

Обойти

Чтобы обойти это, вы можете обернуть пустым в другую функцию, например:

function empty_test($val) {
    return empty($val);
}

И затем назовите это так:

$arr = array_filter($arr, 'empty_test');
person Treffynnon    schedule 06.12.2011
comment
+1 за обходной путь. Вот что-то более креативное (но, думаю, намного дороже): $arr = array_diff($arr, array_filter($arr)); - person BoltClock; 06.12.2011
comment
Ницца. Также немного утомляет ум, чтобы выяснить, какое поведение здесь играет роль! - person Treffynnon; 06.12.2011

См. страницу документации на empty():

Примечание. Поскольку это языковая конструкция, а не функция, ее нельзя вызывать с помощью переменных функций.

Таким образом, в основном empty() не является функцией, и поскольку обратный вызов должен быть функцией, empty() нельзя передавать как обратный вызов.

Но вы можете создать обратный вызов, который может использовать empty(). Следующее должно работать в PHP > 5.3:

$arr = array_filter($arr, function($var){
    return empty($var);
});

В PHP ‹ 5.3 вам нужно сначала создать аналогичную функцию, а затем передать ее в файл array_filter().

Это помогло?

person Tadeck    schedule 06.12.2011
comment
Если вы отфильтровываете пустые значения, просто добавьте !empty($var), так как этот пример отфильтровывает непустые значения, возвращая массив пустых значений. - person Faraz; 07.09.2018

empty() — это языковая конструкция, а не настоящая функция с точки зрения PHP, поэтому вы не можете передать его имя в качестве аргумента таким функциям, как array_filter() и call_user_func_array().

Из руководства:

Примечание. Поскольку это языковая конструкция, а не функция, ее нельзя вызывать с помощью переменные функции

В качестве обходного пути просто оберните его в другую пользовательскую функцию; см. ответ Треффиннона.

person BoltClock    schedule 06.12.2011

Вы можете использовать только функцию array_filter() без обратного вызова:

Удалить пустые элементы массива в PHP

$arr = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
print_r(array_filter($arr)); // removing blank, null, false, 0 (zero) values

Результат:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [4] => JavaScript
)
person Serhii Krasylnykov    schedule 19.09.2018

Я думаю, что существует лучшее решение, и я нашел его, прочитав doc о array_filter

См. этот комментарий: https://www.php.net/manual/fr/function.array-filter.php#111091

<?php

// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter( $array, 'strlen' );

?>

Я позволяю себе опубликовать это только потому, что считаю это очень элегантным решением.

Кроме того, поскольку сам array_filter уже фильтрует значение null или false в качестве обратного вызова по умолчанию, этот код тоже работает:

$array = array('apple', '', 'watermelon');
var_dump(array_filter($array));

----
Output : 
array(2) { [0]=> string(5) "apple" [2]=> string(10) "watermelon" }
person vincent PHILIPPE    schedule 04.09.2020