通过多列获取独特的数组 - PHP

时间:2017-02-11 23:56:29

标签: php arrays multidimensional-array unique

我有一个多维数组,如下所示,

我想创建另一个数组,显示每个城市的唯一用户数

   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
)

3 个答案:

答案 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));