根据PHP foreach中的星期几来过滤

时间:2013-04-16 15:38:10

标签: php facebook-graph-api facebook-php-sdk strtotime

我使用以下方法从Facebook Graph API获取我管理的所有帐户的最近3个月页面浏览量信息:

$since_date = date('Y-m-d', strtotime('-3 months'));
$until_date = date('Y-m-d');
$page_views = $facebook->api('/' . $account['id'] . '/insights/page_views?since=' . $since_date . '&until=' . $until_date . '','GET');

之后我使用php foreach循环(实际上是两个)以所需格式(数组)获取所需信息(页面视图和日期),如下所示:

foreach ($page_views['data'] as $page_view) {
    $i = 0;
    $len = count($page_view['values']);
    foreach($page_view['values'] as $key => $page_view_values) {
        $end_time = strval($page_view_values['end_time']);
        $value = intval($page_view_values['value']);
        echo '[\'' . substr($end_time, 0, -14) . '\', ' . $value . ']';
        if ($i == $len - 1) {
            continue;
        } else {
            echo ', ';
        }
        $i++;
    }

哪个输出还需要以下数组:

(.....],['2013-04-02', 21], ['2013-04-03', 7], ['2013-04-04', 2], ['2013-04-05', 0], ['2013-04-06', 2], ['2013-04-07', 3], ['2013-04-08', 1], ['2013-04-09', 2], ['2013-04-10', 5], ['2013-04-11', 1], ['2013-04-12', 11], ['2013-04-13', 0],[.....)

使用上面的数组,所有工作都应该正常工作。我渲染了一个非常漂亮的图表,但如果我可以根据一周中的几天我想过滤它。例如:我想要一个像上面那样的数组,只有星期一或星期二的日期等等......我需要在第二个php foreach中的某个地方过滤,只返回我想要的日子但是如何?这种需求用于什么条件?或者我应该使用其他方法,例如,从Facebook Graph Api查询其他内容?任何指导都非常受欢迎。

3 个答案:

答案 0 :(得分:0)

你可以根据工作日的3个字母代码做一个开关案例,并为每一天做这样的事情:

$tempDate = '2012-07-10';
echo date('D', strtotime( $tempDate));

输出:星期二

这将允许您按工作日过滤。例如,如果工作日代码为Tue,则只会添加到数组中。所有其他人都将被跳过。

添加@arraintxo注意:

date('N', strtotime($tempDate))

将返回工作日的数值(1到7,1是星期一和7星期日),更容易比较。

答案 1 :(得分:0)

我建议使用类似于当前回复的内容,稍作调整:

$first=false; $cache=array(); $conv=new \Date('2000-01-01T00:00:00Z');
foreach ($page_views['data'] as $page_view) {
  foreach($page_view['values'] as $key => $page_view_values) {
    $end_time = strval($page_view_values['end_time']);
    $ds=substr($end_time, 0, -14);
    $value = intval($page_view_values['value']);
    if(!isset($cache[$ds])
      $cache[$ds]=(int)$conv->modify($ds)->format('N');
    if($first){ echo ', '; $first=false; }
    echo '[\'' . $ds . '\', ' . $value . ', '.$cache[$ds].']';
  }
}

日期索引现在作为数组的第三项出现。注意1:使用缓存,以便您只查看每个日期一次。注意2:使用bool不添加前导分隔符比从计数减少要便宜得多,而计数反过来比计算到数量更便宜(你在第一时间做了什么)。注意3:这会一次又一次地修改$ conv对象,因为我不喜欢创建很多对象,这应该至少与过程样式(date()和strtotime())一样好。

答案 2 :(得分:0)

首先,我要感谢大家的快速回复,这是一个很大的帮助,我非常感激。根据您的指导原则,我以下列方式解决了我的“问题”:

$since_date = date('Y-m-d', strtotime('-3 months'));
$until_date = date('Y-m-d');
$page_views = $facebook->api('/' . $account['id'] . '/insights/page_views?since=' . $since_date . '&until=' . $until_date . '','GET');
    foreach ($page_views['data'] as $page_view) {
        $i = 0;
        foreach($page_view['values'] as $key => $page_view_values) {
            $end_time = strval($page_view_values['end_time']);
            $ds = substr($end_time, 0, -14);
            $value = intval($page_view_values['value']);
            if (date('N', strtotime($ds)) != 1) {
                continue;
            } else {
                if ($i==1) {
                    echo ', ';
                }
                $i=1;
                echo '[\'' . $ds . '\', ' . $value . ']';
            }
        }
    }

我可以使用date('N', strtotime($ds))作为当天的相应数字,为一周中的每一天执行此操作。我收到了我想要的数组,但如果可以的话,我想知道是否可以对名为$page_view_values['value']的变量中的数字求和(我想在一周中的天数之间进行比较)。