我有一个多维数组,如下所示,
我想创建另一个数组,显示每个城市的唯一用户数
Array
(
[0] => Array
(
[id] => 1
[city] => Melbourne
[date_added] => 1435852550
[user_name] => user_1
)
[1] => Array
(
[id] => 2
[city] => Melbourne
[date_added] => 1435852550
[user_name] => user_1
)
[2] => Array
(
[id] => 3
[city] => Sydeny
[date_added] => 1435852550
[user_name] => user_2
)
[3] => Array
(
[id] => 4
[city] => Perth
[date_added] => 1435852550
[user_name] => user_3
)
[4] => Array
(
[id] => 5
[city] => Perth
[date_added] => 1435852550
[user_name] => user_4
)
)
我想要得到的是,每个城市的唯一用户数如下
Array
(
[Melbourne] => 1
[Sydeny] => 1
[Perth] => 2
)
答案 0 :(得分:1)
使用city作为索引,并将数组user_names数组作为值,然后将值映射到值的lentgth。
foreach($array as $v)
{
$temp[$v['city']][$v['user_name']] = 1;
}
$result = array_map(function($v){return count($v);}, $temp);
答案 1 :(得分:0)
使用array_reduce
函数的解决方案:
// $arr is your initial array
$hash = [];
$counts = array_reduce($arr, function($r, $a) use(&$hash){
$hash_str = $a['city'] .'|'. $a['user_name'];
if (!in_array($hash_str, $hash)) {
$hash[] = $hash_str;
(!isset($r[$a['city']]))? $r[$a['city']] = 1 : $r[$a['city']] += 1;
}
return $r;
}, []);
print_r($counts);
答案 2 :(得分:0)
@LF00 的答案是只循环两次并使用一组嵌套的关联键对数据进行分组。与任何其他调用 in_array()
的方法相比,我更推荐这种方法。
@LF00 答案的函数式版本是:
代码:(Demo)
var_export(
array_map(
'count',
array_reduce(
$array,
function($result, $row) {
$result[$row['city']][$row['user_name']] = true;
return $result;
}
)
)
);
@LF00 在 count()
中调用 array_map()
时的回答可能更简洁。
代码:(Demo)
$result = [];
foreach ($array as $row) {
$result[$row['city']][$row['user_name']] = true;
}
var_export(array_map('count', $result));