根据特定值计算PHP数组中的项目数

时间:2014-07-29 22:48:45

标签: php

我有一个如下所示的数组:

Array
(
    [0] => Array
        (
            [id] => 2
            [createdOn] => 2014-03-03 20:49:14
        )

    [1] => Array
        (
            [id] => 3
            [createdOn] => 2014-05-06 08:29:47
        )

    [2] => Array
        (
            [id] => 4
            [createdOn] => 2014-05-07 10:37:56
        )

    [3] => Array
        (
            [id] => 6
            [createdOn] => 2014-06-01 09:11:58
        )

    [4] => Array
        (
            [id] => 7
            [createdOn] => 2014-06-01 12:29:16
        )

)

然而,我想要实现的是根据createdOn日期计算记录在数组中出现的次数。如下所示:

Array
(
    [0] => Array
        {
            [count] => 1
            [createdOn] => 'March'
        }

    [1] => Array
        {
            [count] => 2
            [createdOn] => 'May'
        }

    [2] => Array
        {
            [count] => 2
            [createdOn] => 'June'
        }
)

如何使用PHP获得此结果?

2 个答案:

答案 0 :(得分:2)

这样就可以了解

$dates = array();
$dates[] = array('id' => 1, 'date' => '2014-03-01 12:29:16');
$dates[] = array('id' => 2, 'date' => '2014-03-01 12:29:16');
$dates[] = array('id' => 3, 'date' => '2014-04-01 12:29:16');
$dates[] = array('id' => 4, 'date' => '2014-05-01 12:29:16');
$dates[] = array('id' => 5, 'date' => '2014-06-01 12:29:16');
$dates[] = array('id' => 6, 'date' => '2014-06-01 12:29:16');

$counted = array();

array_walk_recursive($dates, function ($value, $key) use (& $counted) {
    if ($key == 'date') {
        $date = new DateTime($value);
        $monthName = $date->format('M');

        if (!isset($counted[$monthName])) {
            $counted[$monthName] = array('createdOn' => $monthName, 'count' => 0);
        }

        $counted[$monthName]['count']++;
    }
});

var_dump(array_values($counted));

答案 1 :(得分:0)

你实际上可以让PHP为你做繁重的工作,有你需要的所有功能的内置函数。使用array_column()我们可以删除除日期键之外的所有内容,array_map()负责正确的格式化。

$dates = array(
  array('id' => 1, 'date' => '2014-03-01 12:29:16'),
  array('id' => 2, 'date' => '2014-03-01 12:29:16'),
  array('id' => 3, 'date' => '2014-04-01 12:29:16'),
  array('id' => 4, 'date' => '2014-05-01 12:29:16'),
  array('id' => 5, 'date' => '2014-06-01 12:29:16'),
  array('id' => 6, 'date' => '2014-06-01 12:29:16'),
);

$format = function ($ts) {
  return date_create($ts)->format('M');
};

$m = array_map($format, array_column($dates, 'date'));

最后,array_count_values()为我们提供了统计数据。

array_count_values($m) =>

Array
(
  [Mar] => 2
  [Apr] => 1
  [May] => 1
  [Jun] => 2
)

虽然如果你从sql查询中获取数据,那么最好只在那里进行聚合。