PHP数组foreach并显示与模式匹配的所有值

时间:2016-01-15 05:49:16

标签: php arrays foreach

我正在使用scandir获取logs目录中所有访问日志的列表,如果$access_log =某些基于域和月的标准,则可以显示不同月份的访问日志。 / p>

我想要做的是简化此代码,因此我不必写出所有这些if语句和月份变量。

例如,如果每个域有100个访问日志,我必须写出所有这些if语句100次。

访问日志看起来像subdomain.mydomain.com-Jan-2016.gz

所以我试图找出如何重写我的代码,只有1个if语句在$domain中查找$access_log的模式,并在{{{{}}中列出这些访问日志1}}变量。到目前为止,除非我为每个$log_month变量编写一个单独的if语句,否则无法解决这个问题,正如您在foreach循环中的3 if语句示例中所见。

$log_month

2016年1月19日更新

更具体地说,这就是我需要的。每个域旁边都有访问日志的域列表。

域名1 - domain1.com-jan-2016.gz | domain1.com-癸2015.gz

域名2 - domain2.com-jan-2016.gz

域名3 - domain3.com-jan-2016.gz | domain3.com-dec-2015.gz |等|等

每个域旁边我需要它来显示访问日志文件。对于域1,可能有来自不同月份的2或3个文件。对于域2,可能只有1个文件。对于域3,可能有十几个。

我上面的代码的方式适用于我需要的东西。但我想用||压缩代码或者一个简单的if语句,但是当我这样做时,并不是所有访问日志都显示在每个域旁边。只显示一个文件。

如何使用上面代码的精简版本获取每个域名旁边的所有访问日志文件?

1 个答案:

答案 0 :(得分:1)

您可以使用PHP glob 功能而不是使用scandir。 使用glob,您可以通过模式获取路径名。

例如:

$access_logs = glob('*.mydomain.com-*.gz');
$log_month = '';
foreach($access_logs as $access_log) {
    $log_month .= '<li><a href="logs.php?log=' . $access_log . '">' . $access_log . '</a></li>' . "\n            ";
}

2016年1月19日更新

我建议使用正则表达式从文件名中拆分信息(域,月,年)。要收集每个域的所有日志文件,您可以使用域作为数组键。 收集后,您必须遍历所有域,并且可以列出所有相应的日志文件。

<?php

# gathering
$access_logs = glob('*.gz');

$domainList = [];
foreach ($access_logs as $access_log) {
    if (preg_match('/((?:[-A-Za-z0-9]+\.)+[A-Za-z]{2,6})-(\w{3})-(\d{4})/i', $access_log, $matches)) {
        $domain = $matches[1];
        # $month = $matches[2];
        # $year = $matches[3];
        if (!isset($domainList[$domain])) {
            $domainList[$domain] = '';
        }
        $domainList[$domain] .= '<li><a href="logs.php?log=' . $access_log . '">' . $access_log . '</a></li>';
    }
}

# output
foreach ($domainList as $domain => $list) {
    echo "<h1>{$domain}</h1>";
    echo "<ul>{$list}</ul>";
}

您可以自己调整输出。但逻辑做你想要的。