计数时间X出现在JSON中

时间:2014-06-13 17:11:54

标签: php json

所以,我有以下代码:

{
    "request": {
        "data_start": "2013-01-01",
        "data_end": "2014-06-13"
    },
    "response": {
        "status": 1,
        "httpStatus": 200,
        "data": {
            "data": [{
                "Stat": {
                    "offer_id": "8",
                    "clicks": "0",
                    "date": "2013-01-14",
                    "month": "01",
                    "year": "2013",
                    "affiliate_id": "1000"
                }
            }, {
                "Stat": {
                    "offer_id": "8",
                    "clicks": "26",
                    "date": "2013-02-06",
                    "month": "02",
                    "year": "2013",
                    "affiliate_id": "1000"
                }
            }, {
                "Stat": {
                    "offer_id": "8",
                    "clicks": "12",
                    "date": "2013-02-06",
                    "month": "02",
                    "year": "2013",
                    "affiliate_id": "2"
                }
            }
            }]
        }
    }
}

我需要知道多少次" date":" 2013-02-06"例如,使用PHP出现在这个JSON中。这可能吗?为了清楚起见,这只是一个例子,实际的JSON是几千行。

谢谢!

3 个答案:

答案 0 :(得分:0)

正如@PrashantBalan提出的那样,如果它是一个字符串,你可以很简单地做一个计数。一种方法是将字符串拆分为数组,使用“date”:“2013-02-06”作为分隔符,然后只返回数组中元素的数量(减1)。

答案 1 :(得分:0)

只需反序列化JSON并在搜索日期过滤其内部的数据数组。

$json = '...'; // your JSON string
$obj = json_decode($json);
$data_array = $obj->response->data->data;
$search_date = '2013-02-06'; // whatever your search date is

// filter the data array down to those items matching the date
$filtered_data = array_filter($data_array, function($item) use ($search_date) {
    return $item->Stat->date = $search_date;
}
// get count of filtered items
$filtered_count = count($filtered_data);

答案 2 :(得分:0)

Mike指出的最快方法是使用substr_count()。这在C中实现为PHP中的本机方法。此方法不会考虑重叠模式(请参阅PHP文档中的示例)。

如果针每次完全相同并且包含重叠,则可以循环并使用strpos,每次移动偏移。

$offset = 0;
$count = 0;
while(($offset = strpos($json, '"date": "2013-02-06"', $offset) !== false) {
  $offset++;
  $count++;
}

如果针在每种情况下都不精确(额外的空格等),则另一个选项:

$count = preg_match_all('"[dD]ate":\w+"2013-02-06"', $json);

RegEx较慢,因此只能根据需要使用。

如果需要更加密集地使用数据,最好的方法是将其反序列化并从那里开始。反序列化将导致> 2倍内存利用率并产生反序列化所需的周期。考虑每种方法的权衡是很重要的。