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

时间:2017-06-08 00:12:13

标签: php arrays multidimensional-array

我试图计算多个(相同的)值出现在一个巨大的多维数组列表中。在下面的数组中(整个事情的一个小片段)我想要计算有多少" 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
                )
            )
        )
    )
)

1 个答案:

答案 0 :(得分:1)

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的真实数组实现时,有一些意外的密钥匹配,其中密钥位于0Buggy Demo)。为了解决此问题,我只是将==替换为===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在函数外部可用,因为没有returnarray_walk_recursive()返回true | false响应)。
  • 当“叶子节点”的密钥为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