从数据数组中排除一个值
Excluding a value from an array of data
在我的 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;
}
}
你可以这样做:
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
希望对您有所帮助
如果您想要一个允许您扩展电子邮件黑名单的灵活解决方案,您可以使用 preg_match()
以及基于您的不合格电子邮件数组的动态正则表达式模式。
\Q...\E
语法确保模式中的符号被处理 literally
。这与 preg_quote()
(没有函数调用)的效果相同。
代码:(Demo)
$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()
将在找到第一次出现时立即停止 -- 这是最佳代码设计。
代码:(Demo)
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
在我的 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;
}
}
你可以这样做:
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
希望对您有所帮助
如果您想要一个允许您扩展电子邮件黑名单的灵活解决方案,您可以使用 preg_match()
以及基于您的不合格电子邮件数组的动态正则表达式模式。
\Q...\E
语法确保模式中的符号被处理 literally
。这与 preg_quote()
(没有函数调用)的效果相同。
代码:(Demo)
$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()
将在找到第一次出现时立即停止 -- 这是最佳代码设计。
代码:(Demo)
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