检查二维数组的任何行是否与另一个二维数组中的行共享相同的列值

问题描述 投票:0回答:5

我想比较两个数组,如果数组 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]'
    ],
];
php arrays multidimensional-array filter array-intersect
5个回答
1
投票

您可能需要考虑使用电子邮件作为密钥。像这样的东西:

$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));

这会生成一个数组,其中包含第一个数组中第二个数组中存在电子邮件的所有值。然后,您可以迭代该数组以显示错误消息。


1
投票

我将构建数组 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';
    }
}

0
投票

相当标准。

<?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.';
?>

0
投票

这很容易。

$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"; }

在这种情况下将打印“未找到”。


0
投票

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 正在参与排序过程来优化过滤过程。

© www.soinside.com 2019 - 2024. All rights reserved.