我一直在寻找很多答案,但没有一个对我有用。
这是分配给我的$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() 过滤$array中的每个数组:
$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));
这个对我有用
function array_filter_recursive($input){
foreach ($input as &$value){
if (is_array($value)){
$value = array_filter_recursive($value);
}
}
return array_filter($input);
}
这将递归删除多元数组上所有具有 null 值的项目。适用于 PHP>= 5.6。如果要删除所有"空"值,请将!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()
的替换函数可能是:任何"is_"函数,empty(),任何"ctype"函数等等。
如果 OP 的 2nd 级数组包含多个元素,并且 OP 想要删除所有零、假 y、空、空元素(意味着不需要或保证不会发生零),那么 Alastair F 的答案将是最佳选择。
如果OP的输入数组具有未知数量的级别,并且应该删除零/假y/空/空元素,那么Reza Mamun的答案是一种合乎逻辑的递归方法。
我的观点是(以及我花费大量时间和精力来回答这个问题的动机)array_filter()
贪婪,如果您不知道这种默认行为,您的项目可能会默默地输出不正确的信息。 我希望这个解释能为程序员节省一些时间和冲突。