搜索多个字符串的数组?

Search array for multiple strings?

我正在搜索 IF 与电子邮件域匹配的字符串是否存在于记录集中。

$outsideService 是我们要查找的针数组:

$outsideService = array('guest.booking.com','vrbo.com'); // Add outside services to screen for not having emails in DB

我的记录集数组是 $OS,创建如下:

$OS = ($Departing->Results); // Gather recordset  array

我从那个数组创建了一个新数组,其中只有电子邮件 col:

$DepartingOS = array_column($OS, 'email'); // [index, value]

结果(大海捞针):

 Array
 (
     [0] => ivchan630@gmail.com
     [1] => mplotn.346854@guest.booking.com
     [2] => 0
 )

所以现在我需要比较一下是否大海捞针:

 if(preg_match($outsideService, $DepartingOS)) {
    echo ’True’;
}

这没有用。 我认为问题是 preg_match 不适用于像大海捞针一样的数组?这意味着我每次都需要循环查找针。

不过我也试过这种手动对针的方法,还是不行。

if(preg_match('(guest.booking.com|vrbo.com)', $DepartingOS)===1) {
echo 'True';
}

我使用preg_match错了吗?我将如何在记录集数组中搜索针?

您真正需要做的是迭代每个数组,检查 $outsideService 的任何值是否位于 $DepartingOS 内的值内。您可以使用嵌套的 array_reduce, using strpos 来检查匹配项:

$outsideService = array('guest.booking.com','vrbo.com');
$DepartingOS = array('ivchan630@gmail.com', 'mplotn.346854@guest.booking.com', '0');

if (array_reduce($outsideService, function ($c, $OS) use ($DepartingOS) {
    return $c || array_reduce($DepartingOS, function ($c, $DOS) use ($OS) {
        return $c || (strpos($DOS, $OS) !== false);
    }, false);
}, false)) {
    echo "True";
}

输出:

True

这也可以更简单地写成嵌套 foreach 循环:

$found = false;
foreach ($outsideService as $OS) {
    foreach ($DepartingOS as $DOS) {
        if (strpos($DOS, $OS) !== false) {
            $found = true;
            break 2;
        }
    }
}
if ($found) {
    echo "True";
}

Demo on 3v4l.org