我有一个邮政编码列表,每个邮政编码都有一个关键类别。
例如,邮政编码 b 可以有多个类别,如下例所示。
我感兴趣的是计算如下相同的键值对的数量:
想知道实现这一目标的最佳方法是什么。
//list of key value items
$array = array(
'b' => 'GAS',
'b' => 'GAS',
'b' => 'PLUBMING',
'b' => 'PLUBMING',
'ab' => 'PLUBMING'
);
foreach ($array as $k => $v) {
//Count Number values for same key
'b' => 'GAS = 2',
'b' => 'PLUMBING = 2',
'ab' => 'PLUBMING = 1'
}
答案 0 :(得分:0)
我猜你还没有尝试过你的代码。否则你很快就会意识到数组键是唯一的。使用不同的值多次声明一个键将导致只有一个键实例包含最后一个值。
$array = [
'b' => 'GAS',
'b' => 'GAS',
'b' => 'PLUBMING',
'b' => 'PLUBMING',
'ab' => 'PLUBMING'
];
var_dump($array);
// array(2) {
// ["b"]=>
// string(8) "PLUBMING"
// ["ab"]=>
// string(8) "PLUBMING"
// }
不是将一个邮政编码(键)声明为一个类别(值),而是将一个邮政编码声明为多个类别,例如:
$array = [
'b' => [
'GAS',
'GAS',
'PLUBMING',
'PLUBMING',
],
'ab' => [
'PLUBMING',
],
];
然后我们可以使用 array_count_values() 来确定邮政编码中每个类别的频率,例如:
foreach ($array as $postcode => $categories) {
var_dump($postcode, array_count_values($categories));
}
// string(1) "b"
// array(2) {
// ["GAS"]=>
// int(2)
// ["PLUBMING"]=>
// int(2) // }
// string(2) "ab"
// array(1) {
// ["PLUBMING"]=>
// int(1)
// }
答案 1 :(得分:0)
使用 serialize 和 array_count_values 解决键值计数的方法:
<?php
$data =
[
['a'=>'Specials'],
['a'=>'Beat'],
['b'=>'Badmanners'],
['a'=>'Beat'],
['b'=>'Badmanners'],
['b'=>'Bosstones'],
];
$serialized = array_map('serialize', $data);
$counts = array_count_values($serialized);
foreach($counts as $k => $n) {
$arr = unserialize($k);
echo key($arr), ':', $arr[key($arr)], ':', $n, "\n";
}
输出:
a:Specials:1
a:Beat:2
b:Badmanners:2
b:Bosstones:1
并查看$counts
的格式:
var_dump($counts);
输出:
array(4) {
["a:1:{s:1:"a";s:8:"Specials";}"]=>
int(1)
["a:1:{s:1:"a";s:4:"Beat";}"]=>
int(2)
["a:1:{s:1:"b";s:10:"Badmanners";}"]=>
int(2)
["a:1:{s:1:"b";s:9:"Bosstones";}"]=>
int(1)
}