array_filter()
no es de tipo sensible de forma predeterminada. Esto significa que cualquier zero-ish, false-y, nulo, los valores vacíos serán eliminados. Mis enlaces a seguir demostrarán este punto.
La matriz de entrada de muestra del OP es bidimensional. Si la estructura de datos es estática, la recursión no es necesaria. Para cualquiera que quiera filtrar los valores de longitud cero de una matriz multidimensional, proporcionaré un método estático de 2 dim y un método recursivo.
estático 2-dim matriz de: Este código realiza un filtro de "cero-safe" en los elementos 2º nivel y luego elimina subarrays vacíos: (See this demo to see this method work with different (trickier) array data)
$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
)
)
);
aquí es el mismo código como una sola línea:
var_export(array_filter(array_map(function($v){return array_filter($v,'strlen');},$array)));
de salida (como se especifica originalmente por el OP):
array (
)
* si no desea eliminar los subpaneles vacíos, simplemente elimine la llamada externa array_filter()
.
método recursivo para matrices multi-dimensionales de profundidad desconocida: Cuando se desconoce el número de niveles en una matriz, la recursión es una técnica de lógica. El siguiente código procesará cada subcampo, eliminando los valores de longitud cero y cualquier subarreglo vacío a medida que avanza. Here is a demo of this code with a few sample inputs.
$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));
Salida:
array (
0 =>
array (
'Array' =>
array (
'Keep' => 'Keep',
),
'Pets' => 0,
),
1 =>
array (
'FavoriteNumber' => '0',
),
)
Si alguien descubre una matriz de entrada que rompe mi método recursivo, por favor, puesto que (en su forma más simple) como un comentario y voy a actualizar mi respuesta.
array_filter está configurado para matrices 1D. –
¿Puede dar ejemplos de entrada, con salida esperada, por favor? Hay algunas maneras diferentes de interpretar su pregunta, * "Si se ve como lo de arriba, quiero que esté completamente vacío después de que lo haya procesado". * Me está tirando, ¿quiere que desaparezca por completo o ser una matriz vacía? –
Esta es una matriz multidimensional. array_filter solo funciona en una dimensión. Necesita iterar a través de su matriz y aplicar array_filter a cada iteración primero. – Nilpo