我试图计算多个(相同的)值出现在一个巨大的多维数组列表中。在下面的数组中(整个事情的一个小片段)我想要计算有多少" 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
)
)
)
)
)
答案 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的真实数组实现时,有一些意外的密钥匹配,其中密钥位于0
(Buggy 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
在函数外部可用,因为没有return
(array_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