我想比较两个数组,如果数组 1 中的电子邮件地址存在于数组 2 中(此处:
[email protected]
)。在这种情况下,它应该显示电子邮件已存在。
$Array1 = [
[
'username' => 'uname1',
'name' => 'fullname1',
'email' => '[email protected]'
],
[
'username' => 'uname2',
'name' => 'fullname2',
'email' => '[email protected]'
],
[
'username' => 'uname3',
'name' => 'fullname3',
'email' => '[email protected]'
],
];
$Array2 = [
[
'username' => 'uname1',
'name' => 'fullname1',
'email' => '[email protected]'
],
];
您可能需要考虑使用电子邮件作为密钥。像这样的东西:
$a1 = array();
foreach ($Array1 as $v) $a1[$v['email']] = $v;
$a2 = array();
foreach ($Array2 as $v) $a2[$v['email']] = $v;
$intersection = array_values(array_intersect_key($a1, $a2));
这会生成一个数组,其中包含第一个数组中第二个数组中存在电子邮件的所有值。然后,您可以迭代该数组以显示错误消息。
我将构建数组 2 的索引,其中电子邮件地址是关键:
$index = array();
foreach ($Array2 as $item) {
$index[$item['email']] = true;
}
然后,检查数组 1 中的每个项目是否存在现有电子邮件地址仅花费 O(1):
foreach ($Array1 as $item) {
if (isset($index[$item['email']])) {
echo 'email already exists';
}
}
相当标准。
<?php
function userExists() {
global $Array1, $Array2;
for($Array2 as $user) {
for($Array1 as $existingUser) {
if($user['email'] == $existingUser['email']) {
return true;
}
}
}
return false;
}
if(userExists())
echo 'user exists.';
?>
这很容易。
$result = array_search($Array2[0], $Array1)
var_dump($result);
如果你想检查是否找到了某些东西,请记住这样做:
if ($result !== false) { print "Found!"; }
原因是,如果在 $Array1 中的索引 0 处找到结果并将检查写入为
,则 array_search 可以返回整数 0 if ($result == false) { print "Not found"; }
在这种情况下将打印“未找到”。
PHP 有一个原生函数,允许通过一个或多个二维数组对一个二维数组进行比较和过滤。 在
array_uintersect()
的回调中,在目标列值之间使用三向比较运算符。
这是一种优雅且理想的方法,因为不需要准备数据。
代码:(演示)
var_export(
array_uintersect(
$Array2,
$Array1,
fn($a, $b) => $a['email'] <=> $b['email']
)
? 'email already exists'
: 'no matches'
);
如果第一个列出的数组的过滤副本有任何幸存行,则真值检查将表明至少有一封电子邮件匹配。如果第二个数组中没有行与第一个数组的行中的电子邮件值匹配,则将显示“无匹配项”。
对于任何不熟悉带有回调的
intersect
和 diff
数组函数的人来说,$a
和 $b
参数并不严格与第一个和第二个参数相关。事实上,不仅这些变量携带的值可能来自相反顺序的数组,而且两个参数也可能来自同一个数组。 这是因为在幕后,PHP 正在参与排序过程来优化过滤过程。