给定以下数组$mm
Array
(
[147] => Array
(
[pts_m] =>
[pts_mreg] => 1
[pts_cg] => 1
)
[158] => Array
(
[pts_m] =>
[pts_mreg] =>
[pts_cg] => 0
)
[159] => Array
(
[pts_m] =>
[pts_mreg] => 1
[pts_cg] => 1
)
)
当我运行count(array_filter($mm))
时,我得到3
作为结果,因为它不是递归的。count(array_filter($mm), COUNT_RECURSIVE)
也不行,因为我实际上需要递归地运行array_filter
,然后计算其结果。
所以我的问题是:在这种情况下,我如何递归地运行array_filter($mm)
?我期望的结果是4
。
请注意,我没有使用任何回调函数,因此可以排除false、null和empty。
8条答案
按热度按时间eeq64g8w1#
来自PHP
array_filter
文档:3z6pesqy2#
应该可以
或者也许
如果你想使用
array_filter()
(没有回调函数),记住,它也会把0
当作false
,因此它会从数组中 * 移除 * 任何0
-值。如果您使用的是5.3之前的PHP版本,我会使用
foreach
-loop更新
关于以下意见:
Thx @kc我实际上希望该方法删除false,0,empty等
当这真的只是,你想要的,解决的办法也很简单。但现在我不知道,如何解释
我的预期结果是5。
不管怎么说,它现在很短:)
生成的数组如下所示
z9smfwbn3#
更好的选择
一个一直对我有效的实现是这样的:
我注意到有人创建了一个类似的函数,但在我看来,这个函数没有什么优点:
1.您将数组作为引用(而不是其副本)传递,因此该算法是内存友好的
性能指标评测
希望能帮上忙。
alen0pnh4#
此函数通过提供的回调有效地应用filter_recursive
你可以这样使用它:
这也许能帮到某人
cigdeys35#
我需要一个遍历所有节点(包括数组)的数组过滤器递归函数,因此我提出了以下方法:
请在此处查看更多示例:https://github.com/lingtalfi/Bat/blob/master/ArrayTool.md#filterrecursive
unftdfkk6#
这应该适用于回调和模式支持沿着可选的深度支持。
对于嵌套数组,使用
$depth = 0
调用函数将产生与array_filter
相同的结果。4zcjmb1e7#
这让我觉得是一个XY Problem。
1.递归不是必需的,因为数组具有一致的2级深度。
1.不需要生成一个筛选元素数组,这样您就可以遍历筛选数据来对其进行计数。只需遍历一次,并在遇到真实值时将count变量加1即可。
下面的代码段不调用函数(只调用语言构造--
foreach()
),因此效率很高。代码:(Demo)
jgzswidk8#