我一直在寻找很多答案,但他们都没有为我工作。
这是分配给我的$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()
)
答案 0 :(得分:12)
有点迟,但可能会帮助某人寻找相同的答案。我用这个非常简单的方法;
$postArr = array_map('array_filter', $postArr);
$postArr = array_filter( $postArr );
答案 1 :(得分:4)
以下功能适用于我的情况。我们可以使用一个简单的递归函数从多维PHP数组中删除所有空元素:
$('.more-icon').toggleClass('less-icon');
然后我们只需要调用这个函数:
function array_filter_recursive($input){
foreach ($input as &$value){
if (is_array($value)){
$value = array_filter_recursive($value);
}
}
return array_filter($input);
}
答案 2 :(得分:1)
不确定这是否正是您所寻找的。 <击> 撞击>
<击>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;
}
我确信更好的检查并使其更强大可能有助于解决方案。
答案 3 :(得分:0)
答案 4 :(得分:0)
$newArray = array_map('array_filter', $array);
这种语法的工作非常有用,谢谢你们。
答案 5 :(得分:0)
将array_filter
与array_map
一起使用,如下所示:
$arr=array_filter(array_map('array_filter', $arr));
答案 6 :(得分:-1)
这会在multideminsional数组上以递归方式删除所有具有空值的项目。适用于PHP&gt; = 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);
});
}
答案 7 :(得分:-4)
因为数组中的子数组每个只有一个元素,所以可以使用以下两种方法之一简化方法。逻辑上的优点是避免了二级元素上的函数迭代器(int(*)[5]
)。这就是array_filter
更适合此问题/页面的原因。
代码:(Demo)
current()
OR
$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,
),
)
用于检查第二级元素,因为OP仅将整数列为“非空”值。根据可能持有strlen()
,false
,null
,'0'
等的元素,未来的SO读者可能会有不同的要求。0
的合适替换函数可能是:the "is_" functions,empty()中的任何一个,the "ctype" functions中的任何一个,等等。
如果OP的第二级数组拥有多个元素,并且OP想要删除所有的零,is-y,空,null元素(意味着不想要或不保证不发生零),那么{{3将是最好的选择。
如果OP的输入数组具有未知数量的级别,并且应该删除zero-ish / false-y / empty / null元素,则Alastair F's answer是一种逻辑递归方法。
我的观点(我花了这么多时间和精心回答这个问题的动机)strlen()
是贪婪的,如果你不知道这种默认行为,你的项目可能会默默输出不正确的信息。我希望这个解释可以节省程序员一些时间和冲突。