从数据数组中排除值

时间:2018-08-23 04:15:21

标签: php object filtering blacklist

在我的https://graph.microsoft.com/beta/subscriptions 中是否可以排除in_array中的特定字词?

例如,$row->guestEmail@example.comexample1.com值的禁止子字符串。

这是我尝试过的:

$row->guestEmail

2 个答案:

答案 0 :(得分:1)

如果您想要一个灵活的解决方案来扩展您的电子邮件黑名单,则可以将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

答案 1 :(得分:0)

您可以这样做:

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

希望这对您有帮助