寻找在php中实现以下内容的最简单方法:
我有这个带有日期和ID的数组
$data = array(
array("date" => "2016-01", "ids" => array(1,2,3,4,5,6,7,8)),
array("date" => "2016-02", "ids" => array(1,2,9,10,11,12)),
array("date" => "2016-03", "ids" => array(3,16,17,18,19,20,21)),
array("date" => "2016-04", "ids" => array(1,2,3,19,20,22,23))
);
这个想法是按日期计算ID,但也分别从每个月的开始返回计数(现有ID)。 (我希望这是可以理解的)
返回的数组应如下所示:
$data = array(
array("date" => "2016-01", "counter" => array(8)),
array("date" => "2016-02", "counter" => array(2,4)), /* 2 existing ids from 2016-01 and 4 new in 2016-02) */
array("date" => "2016-03", "counter" => array(1,0,6)), /* 1 existing from 2016-01 and 0 exiting from 2016-02 and 6 new */
array("date" => "2016-04", "counter" => array(3,0,2,2)) /* etc. */
);
| 2016-01 | 2016-02 | 2016-03 | 2016-04
------ | ------- | ------- | ------- | -------
2016-01 | 8 | | |
------ | ------- | ------- | ------- | -------
2016-02 | 2 | 4 | |
------ | ------- | ------- | ------- | -------
2016-03 | 1 | 0 | 6 |
------ | ------- | ------- | ------- | -------
2016-04 | 3 | 0 | 2 | 2
当然如果有办法直接在sql中执行此操作,我会接受它:)
答案 0 :(得分:0)
这是一种方法。 (我不确定它是否是最简单的)。循环使用数据集是最简单的部分。
在其中,使用while ($id = array_pop($day['ids']))
考虑当天的每个ID。对于每个id,从第一天开始,并在那天的id中查找id。如果找到了,请递增当天的计数并继续使用下一个ID(continue 2
继续while
循环。)如果找不到,请转到下一个天。如果在到达当前日期时未找到它(由$i < $key
循环中的for
表示),则递增当天的计数并转到下一个ID。
foreach ($data as $key => $day) {
$counts = array_fill(0, $key + 1, 0);
while ($id = array_pop($day['ids'])) {
for ($i=0; $i < $key; $i++) {
$past_day = $data[$i];
if (in_array($id, $past_day['ids'])) {
$counts[$i]++;
continue 2;
}
}
$counts[$key]++;
}
$new_data[] = ['date' => $day['date'], 'counter' => $counts];
}
P.S。我不知道如何在SQL中执行此操作。
答案 1 :(得分:0)
你可以做这样的事情来达到预期的效果,
$newArray = array();
$count = count($data);
for($i = 0; $i < $count; ++$i){
$newArray[$i] = array('date' => $data[$i]['date'], 'counter' => array());
for($j = 0; $j < $i; ++$j){
$counter = 0;
foreach($data[$i]['ids'] as $key => $id){
if(in_array($id, $data[$j]['ids'])){
++$counter;
unset($data[$i]['ids'][$key]);
}
}
$newArray[$i]['counter'][] = $counter;
}
$newArray[$i]['counter'][] = count($data[$i]['ids']);
}
// display $newArray array
var_dump($newArray);