2

我有一群人看起来像这样:

$people =
    Array
    (
        [0] => Array
            (
                [email] => NameSurname@example.com
                [name] => Name Surname
                [count] => 0
            )

        [1] => Array
            (
                [email] => Name2Surname@example.com
                [name] => Name2 Surname
                [count] => 0
            )
    )

我有一个数组,它是 MySQL 查询的结果,如下所示:

$query=
    Array
    (
        [0] => Array
            (
                [email] => NameSurname@example.com
                [name] => Name Surname
            )

        [1] => Array
            (
                [email] => Name2Surname@example.com
                [name] => Name2 Surname
            )

        [2] => Array
            (
                [email] => NameSurname@example.com
                [name] => Name Surname
            )

    )

对于 $people 中的每个电子邮件地址,我想$people['count']等于该电子邮件地址在 $query 中出现的次数。

我已经尝试了很多方法来做到这一点,但我并没有得到想要的结果。

为免生疑问,基于上述示例的最终结果应如下所示:

$people =
    Array
    (
        [0] => Array
            (
                [email] => NameSurname@example.com
                [name] => Name Surname
                [count] => 2
            )

        [1] => Array
            (
                [email] => Name2Surname@example.com
                [name] => Name2 Surname
                [count] => 1
            )
    )
4

2 回答 2

4
foreach ($people as $key => $man) { // iterating through each man
  $_occurences = 0;

  foreach ($query as $_item) // iterating through each result in the result set
    if ($_item['email'] == $man['email']) // comparing current man to each result item
      $_occurences ++;

  $people[$key]['count'] = $_occurences; // saving number of occurrences in the `count` key 

 }

UPD:另一种使用array_map,array_reduce和 niceternary运算符的解决方案。它比一个慢foreach,但紧凑和专业的两倍。

它更慢(在性能方面)bec。函数调用开销,但在“少量”迭代中,这种下降可以忽略不计。它将更新$people数组而不重新分配它。我们&$man通过引用传输了每一个。

array_map(function (&$man) use ($query) {
    $man['count'] = array_reduce($query, function ($count, $row) use ($man) {
        return ($row['email'] === $man['email']) ? ++$count : $count ;
    }, 0);
}, $people);
于 2012-08-12T11:39:55.580 回答
1

不确定这是否正是您所需要的。但是您可以将正在运行的查询更改为:

SELECT COUNT(name) as cnt, name,email FROM table_name GROUP BY name;

然后$query数组看起来像:

$query=
    Array
    (
        [0] => Array
            (
                [email] => NameSurname@example.com
                [name] => Name Surname
                [cnt] => 2
            )

        [1] => Array
            (
                [email] => Name2Surname@example.com
                [name] => Name2 Surname
                [cnt] => 1
            )                  
    )

然后您可以在数组上运行并获取数组cnt中每个项目的$query

于 2012-08-12T11:51:42.107 回答