foreach中包含总数的数据数组

时间:2018-10-03 23:37:35

标签: php arrays count

有没有一种简单的方法可以在我的foreach中创建一个数组,让我显示从黑名单中删除了多少个项目?

预期结果:

guest.booking.com 5

不适用10

代码:

$blacklist = ['@guest.booking.com', '@booking.com', 'N/A', 'n.c@hotel.com', 'n.c@hotels.com'];
$blacklistedEmails = false;

    foreach ($blacklist as $b) {

        if (stripos($row->guestEmail, $b) !== false) {
            $blacklistedEmails = true;
            break;
        }
    }

4 个答案:

答案 0 :(得分:1)

只需将匹配项收集到关联键结果数组中即可。您似乎对0 count元素不感兴趣,因此它们不会在输出中生成。

检查isset()对于避免在首次出现匹配的黑名单值时生成通知很重要。

代码:(Demo

$rows = [
    (object)["guestEmail" => "you@booking.com"],
    (object)["guestEmail" => "you@okay.com"],
    (object)["guestEmail" => "me@booking.com"],
    (object)["guestEmail" => "n/a"],
    (object)["guestEmail" => "somebodyelse@booking.com"],
    (object)["guestEmail" => "youAgain@BOOKING.COM"]
];
$blacklist = ['@guest.booking.com', '@booking.com', 'N/A', 'n.c@hotel.com', 'n.c@hotels.com'];

foreach ($rows as $row) {
    foreach ($blacklist as $b) {
        if (stripos($row->guestEmail, $b) !== false) {
            if (isset($blacklistedcounts[$b])) {  // this important to avoid Notices
                ++$blacklistedcounts[$b];  // increment after the element key exists
            } else {
                $blacklistedcounts[$b] = 1;  // set 1 on first occurrence
            }
            break;  // no need to check for other matches for this guestEmail
        }
    }
}
var_export($blacklistedcounts);

输出:

array (
  '@booking.com' => 4,
  'N/A' => 1,
)

如果出于某种原因您也希望看到零值,则可以使用array_fill_keys(),避免使用isset()有条件,而只需使用++递增语法。

$blacklistcounts = array_fill_keys($blacklist, 0);
... then inside the stripos() condtion ...
++$blacklistedcounts[$b];

答案 1 :(得分:0)

要获取列入黑名单的电子邮件数量,您需要在break循环中删除for,如下所示:

$blacklist = ['@guest.booking.com', '@booking.com', 'N/A', 'n.c@hotel.com', 'n.c@hotels.com'];
$blacklistedEmails = false;
$blacklistCount = 0;

    foreach ($blacklist as $b) {

        if (stripos($row->guestEmail, $b) !== false) {
            $blacklistedEmails = true;
            $blacklistCount++;
        }
    }

这将为您提供$blacklistCount中列入黑名单的电子邮件的数量。如果您需要所有列入黑名单的商品的数组,则可以执行以下操作:

$blacklist = ['@guest.booking.com', '@booking.com', 'N/A', 'n.c@hotel.com', 'n.c@hotels.com'];
$blacklistedEmails = false;
$blackEmails = [];

    foreach ($blacklist as $b) {

        if (stripos($row->guestEmail, $b) !== false) {
            $blacklistedEmails = true;
            $blackEmails[] = $row->guestEmail;
        }
    }

这将为您提供$blackEmails中一系列列入黑名单的电子邮件。然后,您可以使用:

$blacklistCount = count($blackEmails);

这将为您提供数组和计数。

答案 2 :(得分:0)

不确定这是否是您的意思,因为它非常基本,但是下面的代码似乎可以满足您的要求。

<?php
$blacklist = ['@guest.booking.com', '@booking.com', 'N/A', 'n.c@hotel.com', 'n.c@hotels.com'];
$blacklistedEmails = false;

$blacklistCount = array();
foreach ($blacklist as $b){
    $blacklistCount[$b] = 0;;
}

foreach ($blacklist as $b) {
    if (stripos("james@booking.com", $b) !== false) {
        $blacklistCount[$b] += 1;
        break;
    }
}
 print_r($blacklistCount);

?>

产生此输出。

Array
(
    [@guest.booking.com] => 0
    [@booking.com] => 1
    [N/A] => 0
    [n.c@hotel.com] => 0
    [n.c@hotels.com] => 0
)

很显然,您需要循环浏览电子邮件列表以计算每个列入黑名单的项目的点击率。我刚刚展示了一个示例。

答案 3 :(得分:0)

我假设您正在通过此检查运行一堆行(否则我看不到计数> 1)。

获取每封电子邮件的命中计数的一种简单方法是使用黑名单中的电子邮件作为键并以计数作为值来创建关联数组。当您遍历循环时,只需增加键的值即可。

$blacklist = ['@guest.booking.com', '@booking.com', 'N/A', 'n.c@hotel.com', 'n.c@hotels.com'];
$blacklistedEmailCounts = [];


foreach ($rows as $row){
    foreach ($blacklist as $b) {

        if (stripos($row->guestEmail, $b) !== false) {
            $blacklistedEmailCounts[$b]++;
        }
    }
}

要输出值,您可以执行以下操作:

foreach($blacklistedEmailCounts as $email=>$count){
    echo "$email: $count" . '<br>';
}