Искать в массиве по нескольким строкам? - PullRequest
0 голосов
/ 07 января 2020

Я ищу, если в наборе записей присутствует строка, соответствующая доменам электронной почты.

$ 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

Из этого массива я создаю новый массив только с кольцом электронной почты:

$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 не работает с массивом, как стог сена? Это значит, что мне нужно, чтобы l oop массив каждый раз искал иглу.

Но я также попробовал этот метод, где иглы устанавливаются вручную, но все равно не повезло.

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

Я неправильно использую preg_match? Как бы я искал иглы в массиве наборов записей

1 Ответ

1 голос
/ 07 января 2020

Что вам действительно нужно сделать, так это перебрать каждый из ваших массивов, проверяя, находится ли какое-либо значение $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 l oop:

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

Демонстрация на 3v4l.org

...