Quiero eliminar todos los valores nulos o en blanco, pero no los valores falsos y 0 de la matriz recursiva.
function isNotNull($val) { if(is_array($val)) { $ret = array_filter($val, 'isNotNull'); return $ret; } else { return (!is_null($val) && $val !== ''); } }$matriz = array_filter($matriz, 'noesNulo');
Aporte:
$arr = array( "stringKey" => "Abc", "boolKey" => false, "zeroKey" => 0, "blankKey" => '', "newArr" => array( "stringKey2"=>"Abc2", "boolKey2"=>false, "zeroKey2" => 0, "blankKey2"=>"", "blankArr" => array() ) );Esto da salida:
Array ( [stringKey] => Abc [boolKey] => [zeroKey] => 0 [newArr] => Array ( [stringKey2] => Abc2 [boolKey2] => [zeroKey2] => 0 [blankKey2] => [blankArr] => Array ( ) ) )Pero quiero la siguiente salida:
Array ( [stringKey] => Abc [boolKey] => [zeroKey] => 0 [newArr] => Array ( [stringKey2] => Abc2 [boolKey2] => [zeroKey2] => 0 ) )Usé array_filter con la función de devolución de llamada, pero solo filtra una matriz simple, no una matriz multidimensional. No quiero usar bucle.
Puede combinar array_map y array_filter en una función llamada recursiva. Algo como esto podría funcionar para usted.
function filterNotNull($array) { $array = array_map(function($item) { return is_array($item) ? filterNotNull($item) : $item; }, $array); return array_filter($array, function($item) { return $item !== "" && $item !== null && (!is_array($item) || count($item) > 0); }); }No es necesario reinventar la recursividad usted mismo. Puedes usar RecursiveCallbackFilterIterator :
$iterator = new RecursiveIteratorIterator( new RecursiveCallbackFilterIterator( new RecursiveArrayIterator($arr), function ($value) { return $value !== null && $value !== ''; } ) ); $result = iterator_to_array($iterator);Aquí está la demostración de trabajo .
Deberías intentar usar tanto material de la biblioteca PHP estándar (SPL) como puedas.
ACTUALIZACIÓN: como se indica en los comentarios, la solución con iterador en realidad no es adecuada para este propósito.
En los comentarios a la función array_walk_recursive puede encontrar la implementación de la función walk_recursive_remove :
function walk_recursive_remove (array $array, callable $callback) { foreach ($array as $k => $v) { if (is_array($v)) { $array[$k] = walk_recursive_remove($v, $callback); } else { if ($callback($v, $k)) { unset($array[$k]); } } } return $array; }Esta versión generalizada de la función de recursión toma criterios en forma de devolución de llamada. Con esta función, puede eliminar elementos vacíos como este:
$result = walk_recursive_remove($arr, function ($value) { return $value === null || $value === ''; });Aquí está la demostración de trabajo .
Aquí necesita filtrar una matriz para empty string . En este código a continuación, puede agregar ningún cheque para filtrarlo recursivamente. Espero que funcione bien.
Pruebe este fragmento de código aquí
<?php ini_set('display_errors', 1); //Using more complexed sample array for filter it. $arr = array( "stringKey" => "Abc", "boolKey" => false, "zeroKey" => 0, "blankKey" => '', "newArr" => array( "stringKey2" => "Abc2", "boolKey2" => false, "zeroKey2" => 0, "blankKey2" => "", "blankArr" => array( "blankString"=>"", "zeroKey"=>0, "blankArr3"=>array() ) ) ); $result=recursiveFilter($arr); print_r($result); function recursiveFilter($value) { foreach ($value as $key => $value1) { if ($value1 === "") unset($value[$key]);//you can add no. of conditions here. else if (is_array($value1)) $value[$key] = recursiveFilter($value1); } return $value; }Producción:
Array ( [stringKey] => Abc [boolKey] => [zeroKey] => 0 [newArr] => Array ( [stringKey2] => Abc2 [boolKey2] => [zeroKey2] => 0 [blankArr] => Array ( [zeroKey] => 0 [blankArr3] => Array ( ) ) ) )