0

我通过以下方法从 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 查询其他内容?任何指导都非常受欢迎。

4

3 回答 3

0

例如,您可以根据工作日的 3 个字母代码做一个 switch case,并为每一天做这样的事情:

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

它将输出:星期二

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

添加了@arraintxo 注释:

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

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

于 2013-04-16T15:41:29.063 回答
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'](我想比较一周中的天数)。

于 2013-04-17T10:09:03.303 回答
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())一样执行。

于 2013-04-16T16:05:54.360 回答