【问题标题】:Search array for multiple strings?搜索多个字符串的数组?
【发布时间】:2020-01-07 01:48:05
【问题描述】:

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

$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 错误?如何在记录集数组中搜索针?

【问题讨论】:

    标签: php arrays preg-match


    【解决方案1】:

    您真正需要做的是迭代每个数组,检查$outsideService 的任何值是否位于$DepartingOS 内的值内。您可以使用嵌套的array_reduce 执行此操作,使用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

    【讨论】:

    • 是的,虽然我很难理解(学习),但这很有效。 $c 引用了什么(缩写)?
    • @Burndog 我道歉。有时我会对 PHP 的数组函数感到厌烦。无论如何要回答你的问题,$c 是一个累加器,它只是跟踪我们是否找到匹配项的当前状态;这是array_reduce 最终返回的值。但是我已经用一个简单的嵌套 foreach 循环编辑了我的答案,无论如何这可能是更好的代码。
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多