将包含日期的PHP数组过滤为年度摘要

时间:2010-03-14 11:37:56

标签: php arrays datetime

我正在研究一种基于PHP数组内容在某个月内创建事务摘要的方法。

预期结果(删除布局):

-------------------------------------------
|   December 2009    |         12         |
|   January  2010    |         02         |
|   February 2010    |         47         |
|   March    2010    |         108        |
|   April    2010    |         499        |
-------------------------------------------

根据我的数组:

Array
(
    [0] => Array
        (
            [name] => 2009-10-23
            [values] => Array
                (
                    [0] => INzY2MTI4ZWM4OGRm
                )

        )

    [1] => Array
        (
            [name] => 2009-10-26
            [values] => Array
                (
                    [0] => IYmIzOWNmMmU3OWQz
                )

        )

    [2] => Array
        (
            [name] => 2009-11-23
            [values] => Array
                (
                    [0] => INTg4YzgxYWU1ODkx
                    [1] => IMjhkNDZkY2FjNDhl
                )

        )

    [3] => Array
        (
            [name] => 2009-11-24
            [values] => Array
                (
                    [0] => INTg4YzgxYWU1ODkx
                    [1] => INTg4YzgxYWU1ODkx
                )

        )

    [4] => Array
        (
            [name] => 2009-12-01
            [values] => Array
                (
                    [0] => IMWFiODk5ZjU1OTFk
                )

        )

无论我尝试过什么,我都没有运气。特别是添加不包含任何变量的月份。

3 个答案:

答案 0 :(得分:2)

$summary = array();
foreach($transactions as $t)
{
    $month = substr($t['name'], 0, 7);
    if(!isset($summary[$month]))
        $summary[$month] = 0;

    if(isset($t['values']))
        $summary[$month] += count($t['values']);
}

将导致:

Array
(
    [2009-10] => 2
    [2009-11] => 4
    [2009-12] => 1
)

答案 1 :(得分:2)

这是reducing数据数组到您想要的摘要的典型情况。

$data = array(
    array('name' => '2009-10-23', 'values' => array('INzY2MTI4ZWM4OGRm')),
    array('name' => '2009-10-26', 'values' => array('IYmIzOWNmMmU3OWQz')),
    array('name' => '2009-11-23', 'values' => array('INTg4YzgxYWU1ODkx', 'IMjhkNDZkY2FjNDhl')),
    array('name' => '2009-11-24', 'values' => array('INTg4YzgxYWU1ODkx', 'INTg4YzgxYWU1ODkx')),
    array('name' => '2009-12-01', 'values' => array('IMWFiODk5ZjU1OTFk'))
);

function count_by_month($reduced, $current) {
    $month = date('F Y', strtotime($current['name']));

    if ( ! isset($reduced[$month])) {
        $reduced[$month] = 0;
    }

    $reduced[$month] += count($current['values']);

    return $reduced;
}

// Take the data array and return an array of
// month (key) and transaction count for that month (value)
$counts = array_reduce($data, 'count_by_month');

print_r($counts);

答案 2 :(得分:0)

如果我理解得很好:

  1. 使用12个元素初始化数组$A,将每个元素设置为0
  2. 循环遍历您的数组,并为每个值$v计算$m的月份$v['name'],计算$v['values']中的元素数量,并将该元素数量添加到{ {1}}
  3. 以精美的格式打印$A[$m]的内容
  4. 如果那不是您所需要的,也许您需要举例说明预期输出与您的数组匹配。