Фильтрация массива PHP, содержащего даты, в годовую сводку - PullRequest
0 голосов
/ 14 марта 2010

Я ищу способ создания сводки транзакций за определенный месяц на основе содержимого массива 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 ]

2 голосов
/ 14 марта 2010
$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
)
2 голосов
/ 14 марта 2010

Это типичный случай для сокращения массива данных в требуемую сводку.

$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);
0 голосов
/ 14 марта 2010

Если я хорошо понимаю:

  1. инициализировать массив $A с 12 элементами, установив для каждого элемента значение 0
  2. цикл по вашему массиву и для каждого значения $v вычислить месяц $m из $v['name'], вычислить номер элемента в $v['values'] и добавить это число элемента в $A[$m]
  3. печать содержимого $A с хорошим форматированием

Если это не то, что вам нужно, возможно, вам нужно привести пример, где ожидаемый результат соответствует вашему массиву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...