我正在尝试计算在庞大的多维数组列表中显示了多少(相同的)值。在下面的数组(整个事情的一小部分)中,我想计算有多少"parentID"值是相同的。如本例所示,有 2 个具有相同值的父 ID。我使用 For 循环非常接近,但由于每个"类别详细信息"数组都有随机数量的子数组,因此我得到了未定义的偏移错误。以下是我接近的内容:
$number_of_same = 0;
for ($row = 0; $row < 5; $row++) {
if($array['results'][$row]['categoryDetails'][$row]["parentID"]=="xID") {
$number_of_same++;
}
}
Array (
[resultsTotal] => 754
[results] => Array (
[0] => Array (
[blogComments] => 0
[categoryDetails] => Array (
[0] => Array (
[parentId] => 1697731
)
)
)
[1] => Array (
[blogComments] => 0
[categoryDetails] => Array (
[0] => Array (
[parentId] => 1697731
)
[1] => Array (
[parentId] => 1702267
)
)
)
)
)
array_walk_recursive()
怎么样?
输入:
$array=[
'resultsTotal'=> 754,
'results'=> [
[
'blogComments'=> 0,
'categoryDetails'=> [
['parentId'=> 1697731]
]
],
[
'blogComments'=> 0,
'categoryDetails'=> [
[
'parentId'=> 1697731
],
[
'parentId'=> 1702267
]
]
]
]
];
方法:
警告,我发布的第一个
array_walk_recursive()
代码块用于==
识别名为parentId
的键。 这与 OP 发布的示例数组一起工作。但是,当使用 OP 的实数组实现时,有一些意外的键匹配,其中键0
(错误演示)。 为了纠正这种行为,我只是将==
替换为===
,array_walk_recursive()
代码块恢复正常。
array_walk_recursive($array,function($v,$k)use(&$result){
if($k==='parentId'){
if(!isset($result[$v])){$result[$v]=0;}
++$result[$v];
}
}
);
var_export($result);
输出:
array (
1697731 => 2,
1702267 => 1,
)
解释:
- 匿名函数调用将在遍历输入数组的所有"叶节点"(具有值与数组的键)时提供键和值。
use(&$result)
使$result
在函数外部可用,因为没有return
(array_walk_recursive()
返回真|假响应)。- 当"叶节点"具有
parentId
的键时,它首先确保该键存在于$result
数组中,然后将其递增。
*为了提高速度,您可以尝试减少输入字符串,以仅隔离可能包含parentId
键的多维数组部分。
这是一个非递归方法:
foreach(array_column($array['results'],'categoryDetails') as $details){
foreach($details as $a){
// if(isset($a['parentId'])){ // only use this if receiving a notice/warning - trying to access non-existent element
if(!isset($result[$a['parentId']])){$result[$a['parentId']]=0;}
++$result[$a['parentId']];
// }
}
}
var_export($result); // same result without any side effects