PHP按日期从数组中获取不同的ID

时间:2016-10-07 16:34:35

标签: php arrays loops

寻找在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中执行此操作,我会接受它:)

2 个答案:

答案 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);

这是live demo