Исключение значения из массива данных

В моем in_array там, что я могу исключить конкретные термины из $row->guestEmail?

Например, @example.com а также example1.com запрещенные подстроки для $row->guestEmail ценности.

Вот что я попробовал:

foreach ($json->data as $row) {
if (!in_array($row->guestEmail, $emails)
&& date('Y-m-d', strtotime($row->endDate))== date('Y-m-d')) {
$guests[] = array(
'FirstName'      => $row->guestFirstName,
'LastName'       => $row->guestLastName,
'email'          => $row->guestEmail,
'country'        => $row->guestCountry,
'check-in_date'  => $row->startDate,
'check-out_date' => $row->endDate,
);
$emails[] = $row->guestEmail;
}
}

1

Решение

Если вы хотите гибкое решение, которое позволит вам расширить черный список электронных писем, вы можете использовать preg_match() с динамическим шаблоном регулярных выражений, основанным на вашем массиве дисквалифицированных писем.

\Q...\E синтаксис гарантирует, что символы в шаблоне обрабатываются literally, Это тот же эффект, что и preg_quote() (без вызова функции).

Код: (демонстрация)

$objs = (object)[
'data' => [
(object)['guestEmail' => 'bad@example.com'],
(object)['guestEmail' => 'okay@goodstuff.com'],
(object)['guestEmail' => 'nope@example1.com']
]
];

$blacklist = ['@example.com',  'example1.com'];
$regex = '~\Q' . implode('\E|\Q', $blacklist) . '\E~';

foreach ($objs->data as $row) {
if (!preg_match($regex, $row->guestEmail)) {
$emails[] = $row->guestEmail;
}
}

var_export($emails);

Выход:

array (
0 => 'okay@goodstuff.com',
)

Если вам не нравится идея регулярных выражений, вы можете stripos() за каждый элемент в черном списке. stripos() будет работать лучше, чем substr_count() так как substr_count() продолжит читать строку до конца (пытаясь точно подсчитать количество найденных строк). stripos() остановится, как только обнаружит первое вхождение — это оптимальный дизайн кода.

Код: (демонстрация)

foreach ($objs->data as $row) {
foreach ($blacklist as $forbidden_string) {
if (stripos($row->guestEmail, $forbidden_string) !== false) {
continue 2;
}
}
$emails[] = $row->guestEmail;
}
// same result as first snippet
1

Другие решения

Вы можете просто сделать так:

if (!in_array($row->guestEmail, $emails)
&& date('Y-m-d', strtotime($row->endDate))== date('Y-m-d') && substr_count($row->guestEmail, 'example.com') < '1' && substr_count($row->guestEmail, 'example1.com') < '1') {

//your code

Надеюсь, что это поможет вам

0