Php 计算一个数组中出现的值在另一个数组中的出现次数
我有一组人看起来像这样:Php 计算一个数组中出现的值在另一个数组中的出现次数,php,arrays,Php,Arrays,我有一组人看起来像这样: $people = Array ( [0] => Array ( [email] => NameSurname@example.com [name] => Name Surname [count] => 0 ) [1] => Array
$people =
Array
(
[0] => Array
(
[email] => NameSurname@example.com
[name] => Name Surname
[count] => 0
)
[1] => Array
(
[email] => Name2Surname@example.com
[name] => Name2 Surname
[count] => 0
)
)
$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
)
)
我有一个数组,它是MySQL查询的结果,如下所示:
$people =
Array
(
[0] => Array
(
[email] => NameSurname@example.com
[name] => Name Surname
[count] => 0
)
[1] => Array
(
[email] => Name2Surname@example.com
[name] => Name2 Surname
[count] => 0
)
)
$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
)
)
$query=
Array
(
[0] => Array
(
[email] => NameSurname@example.com
[name] => Name Surname
[cnt] => 2
)
[1] => Array
(
[email] => Name2Surname@example.com
[name] => Name2 Surname
[cnt] => 1
)
)
UPD:使用
array\u map
、array\u reduce
和nice三元
运算符的又一个解决方案。它的速度比使用foreach的速度慢,但紧凑性和专业性是前者的两倍
它(在性能方面)较慢。函数调用开销的减少,但在“少量”的迭代中,这种减少可以忽略不计。它将更新$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);
不确定这是否正是您需要的,但您可以将正在运行的查询更改为:
SELECT COUNT(name) as cnt, name,email FROM table_name GROUP BY name;
然后,$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
)
)
$query=
Array
(
[0] => Array
(
[email] => NameSurname@example.com
[name] => Name Surname
[cnt] => 2
)
[1] => Array
(
[email] => Name2Surname@example.com
[name] => Name2 Surname
[cnt] => 1
)
)
然后您可以在数组上运行,只需获取
$query
数组中每个项目的cnt
。检查重复值的代码在哪里。您可以直接从数据库中选择计数的电子邮件吗?类似这样的事情:从电子邮件所在的表中选择count(*)NameSurname@example.com', 'Name2Surname@example.com“)通过电子邮件分组
?我明白你们两人的意思,但在这种特殊情况下两者都没有用。数组实际上包含的信息比上面显示的多得多,因此,重复值不是问题。至于MySQL查询,每个数组可能包含数百个项,因此任何额外的查询都不是最优的。谢谢你花时间评论,就这样-非常感谢。很快就得到了我需要的答案,并为下一次学到了新的东西。干得好,谢谢你的快速回复。谢谢,回答得好。我们正在寻找一种更为PHP的方法来实现这一点,@Paul T.Rawkeen得到了我所希望的解决方案。