所以,我有以下代码:
{
"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是几千行。
谢谢!
答案 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倍内存利用率并产生反序列化所需的周期。考虑每种方法的权衡是很重要的。