我一直在寻找很多答案,但他们都不是为我工作。
这是分配给我的数据$quantities
数组:
Array(
[10] => Array([25.00] => 1)
[9] => Array([30.00] => 3)
[8] => Array([30.00] => 4)
[12] => Array([35.00] => )
[1] => Array([30.00] => )
[2] => Array([30.00] => )
)
我正在寻找一种方式来与像空值删除子阵[12]
[1]
和[2]
同时保持一切。
期望的结果:
Array(
[10] => Array([25.00] => 1)
[9] => Array([30.00] => 3)
[8] => Array([30.00] => 4)
)
我尝试了很多的功能在PHP官方文档和他们没有工作。
我用这一个:
function array_filter_recursive($array, $callback = null) {
foreach ($array as $key => & $value) {
if (is_array($value)) {
$value = array_filter_recursive($value, $callback);
} else {
if ( ! is_null($callback)) {
if ( ! $callback($value)) {
unset($array[$key]);
}
} else {
if ( ! (bool) $value) {
unset($array[$key]);
}
}
}
}
unset($value);
return $array;
}
但它不仅能消除在子数组元素; 我需要的子阵被完全删除。
我不希望这样的:
Array(
[10] => Array([25.00] => 1)
[9] => Array([30.00] => 3)
[8] => Array([30.00] => 4)
[12] => Array()
[1] => Array()
[2] => Array()
)
有点晚,但可以帮助别人寻找相同的答案。 我用这个非常简单的方法;
- 从包含没有值嵌套阵列中删除所有的键,然后
- 除去所有的空嵌套数组。
$postArr = array_map('array_filter', $postArr);
$postArr = array_filter( $postArr );
下面的函数工作了我的情况。 我们可以用一个简单的递归函数删除多维数组PHP所有空元素:
function array_filter_recursive($input){
foreach ($input as &$value){
if (is_array($value)){
$value = array_filter_recursive($value);
}
}
return array_filter($input);
}
然后,我们只需要调用这个函数:
$myArray = array_filter_recursive($myArray);
不知道如果这正是你寻找的。
function array_remove_null($array) {
foreach ($array as $key => $value)
{
if(is_null($value))
unset($array[$key]);
if(is_array($value))
$array[$key] = array_remove_null($value);
}
return $array;
}
更新(更正):
function array_remove_null($array) {
foreach ($array as $key => $value)
{
if(is_null($value))
unset($array[$key]);
if(is_string($value) && empty($value))
unset($array[$key]);
if(is_array($value))
$array[$key] = array_remove_null($value);
if(isset($array[$key]) && count($array[$key])==0)
unset($array[$key]);
}
return $array;
}
我敢肯定,更完善的检查,使这个更强大的可以帮助解决。
使用array_map()用于过滤器在$数组每个数组:
$newArray = array_map('array_filter', $array);
这里的演示
$newArray = array_map('array_filter', $array);
这sintax它的工作,非常有助于充分感谢的家伙..
使用array_filter
与array_map
象下面这样:
$arr=array_filter(array_map('array_filter', $arr));
这消除了与递归上multideminsional阵列空值的所有项目。 适用于PHP> = 5.6。 如果你想删除所有“empry”的价值观,更换!is_null($value)
与!empty($value)
。
function recursivelyRemoveItemsWithNullValuesFromArray(array $data = []): array
{
$data = array_map(function($value) {
return is_array($value) ? recursivelyRemoveItemsWithNullValuesFromArray($value) : $value;
}, $data);
return array_filter($data, function($value) {
return !is_null($value);
});
}
因为你的阵列中的子阵列只有每一个元素,可以简化使用以下两种方法的方法。 逻辑优点是避免了功能迭代器( array_filter
在第二级上的元素)。 这就是为什么current()
更适合这个问题/页。
编号:( 演示 )
$quantities=[
10=>['25.00'=>1],
9=>['30.00'=>3],
8=>['30.00'=>4],
12=>['35.00'=>null],
1=>['30.00'=>''],
2=>['30.00'=>null]
];
var_export(array_filter($quantities,function($a){return strlen(current($a));}));
要么
foreach($quantities as $key=>$sub){ // could be done "by reference" but that impacts code stability
if(!strlen(current($sub))){ // if subarray value has no length
unset($quantities[$key]);
}
}
var_export($quantities);
两个输出相同的结果(其故意删除空值,并保留0
值)
array (
10 =>
array (
'25.00' => 1,
),
9 =>
array (
'30.00' => 3,
),
8 =>
array (
'30.00' => 4,
),
)
在上述方法中, strlen()
被用于检查第二级元素,因为OP仅列的整数为“非空”值。 未来SO读者可以具有基于元素不同的要求可能保持false
, null
, '0'
, 0
,等等的合适的替代函数strlen()
可以是:任何的的“确保对方”功能 , 空的()中,任何的“CTYPE”功能 ,等等。
如果OP的第二级阵列持有一个以上的元素和OP想删除所有零十岁上下,假Y,空,空元素(这意味着零不想要的或保证不会发生),那么阿拉斯泰尔·F公司的回答将是最好的选择。
如果OP的输入数组有数目不详的水平和零ISH /假Y /空/空元素应该被删除,然后礼马蒙的回答是一个逻辑,递归方法。
我的观点存在(和我的背后花了这么多时间和精力来回答这个问题的动机),其array_filter()
是贪婪的,如果你没有意识到此默认行为,您的项目可能悄无声息输出不正确的信息。 我希望这个解释可以节省程序员一定的时间和纷争。