array_filter()
по умолчанию не зависит от типа.Это означает, что любые значения zero-ish , false-y, null, empty будут удалены.Мои ссылки, чтобы следовать, продемонстрируют эту точку.
Пример входного массива OP является двумерным.Если структура данных является статической, то рекурсия не требуется.Для тех, кто хотел бы фильтровать значения нулевой длины из многомерного массива, я предоставлю статический 2-мерный метод и рекурсивный метод.
Статический 2-мерный массив : Этот код выполняет «нулевой безопасный» фильтр для элементов 2-го уровня, а затем удаляет пустые подмассивы: ( См. Эту демонстрацию, чтобы увидеть, как этот метод работает с различными (более сложными) данными массива )
$array=[
['Name'=>'','EmailAddress'=>'']
];
var_export(
array_filter( // remove the 2nd level in the event that all subarray elements are removed
array_map( // access/iterate 2nd level values
function($v){
return array_filter($v,'strlen'); // filter out subarray elements with zero-length values
},$array // the input array
)
)
);
Вот тот же код, что и в одной строке:
var_export(array_filter(array_map(function($v){return array_filter($v,'strlen');},$array)));
Вывод (как изначально указано в OP):
array (
)
*, если вы этого не сделаетехотите удалить пустые подмассивы, просто удалите внешний вызов array_filter()
.
Рекурсивный метод для многомерных массивов неизвестной глубины : Когда количество уровней в массивенеизвестны, рекурсия логическая техника.Следующий код будет обрабатывать каждый подмассив, удаляя значения нулевой длины и любые пустые подмассивы по мере их поступления. Вот демонстрация этого кода с несколькими примерами входных данных.
$array=[
['Name'=>'','Array'=>['Keep'=>'Keep','Drop'=>['Drop2'=>'']],'EmailAddress'=>'','Pets'=>0,'Children'=>null],
['Name'=>'','EmailAddress'=>'','FavoriteNumber'=>'0']
];
function removeEmptyValuesAndSubarrays($array){
foreach($array as $k=>&$v){
if(is_array($v)){
$v=removeEmptyValuesAndSubarrays($v); // filter subarray and update array
if(!sizeof($v)){ // check array count
unset($array[$k]);
}
}elseif(!strlen($v)){ // this will handle (int) type values correctly
unset($array[$k]);
}
}
return $array;
}
var_export(removeEmptyValuesAndSubarrays($array));
Выходные данные:
array (
0 =>
array (
'Array' =>
array (
'Keep' => 'Keep',
),
'Pets' => 0,
),
1 =>
array (
'FavoriteNumber' => '0',
),
)
Если кто-нибудь обнаружит входной массив, который нарушает мой рекурсивный методПожалуйста, опубликуйте его (в его самой простой форме) как комментарий, и я обновлю свой ответ.