在具有未知嵌套级别的多维数组中计算相同的值



我正在尝试计算在庞大的多维数组列表中显示了多少(相同的)值。在下面的数组(整个事情的一小部分)中,我想计算有多少"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