【问题标题】:Count Array Value by Key按键计数数组值
【发布时间】:2015-06-24 18:39:18
【问题描述】:

假设我有这样的数组:

Array (
[2015-03-14] => 3
[2015-05-23] => 10 
[2015-06-21] => 7 
[2015-05-24] => 3
[2015-06-27] => 10 
[2015-06-29] => 7
) 

说明:

关键是 DATE,有几个不同的月份和日期(03 = 三月,05 = 五月等)

问题

如何根据 Key 计算总价值,例如有人设置日期范围字段(在前端页面中)并从 Key 2015-03-14 到 2015-06-27 获取总价值?

或者,有没有其他方法可以让它更简单?

【问题讨论】:

  • 你试过了吗?从输入、当前输出和预期输出中举例说明。
  • 总价值”是什么意思?三月日期的计数,五月日期的计数等?
  • 您如何将日期存储到关键字段中?它们是格式化为字符串还是 unix 时间戳?无论如何,我唯一能想到的就是遍历数组并检查键是否在范围内。如果数组按键排序 (php.net/manual/en/function.ksort.php) 并且您以某种方式知道开始键,您可能会获得更好的性能。

标签: php sql arrays


【解决方案1】:

如果您知道您的键始终是日期,您可以使用您的键构造日期对象并使用日期比较。

<?php

$arr = array(
    '2015-03-14' => 3,
    '2015-05-23' => 10,
    '2015-06-21' => 7, 
    '2015-05-24' => 3,
    '2015-06-27' => 10, 
    '2015-06-29' => 7,
);

$rangeStart = date('2015-03-14');
$rangeEnd = date('2015-06-27');

$sum = 0;
foreach ($arr as $key=>$value) {
    $d = date($key);
    if ($d >= $rangeStart && $d <= $rangeEnd) {
        $sum += $arr[$key];
    }
}

echo $sum;

【讨论】:

  • date('2015-03-14') = string(10) "2015-03-14".
  • 太棒了!非常感谢... :)
【解决方案2】:

首先我要问的是,您是否有权访问 SQL 接口来获取此信息? SQL 可以更好地处理此类事情很多。如果您从一开始就只从数据库中选择您需要的条目,那么生成的代码会表现得更好、更容易理解和更容易编写。

根据您的架构,代码可能如下所示(假设您应该使用 PDO):

$stmt = $db->prepare("
    SELECT SUM(your_count_field) 
    FROM your_table
    WHERE your_date_field BETWEEN '?' AND '?'
");
$result = $stmt->execute([$date_start, $date_end]);

如果没有这个,我认为没有简单的方法。 @mittmemo 有一个很好的解决方案,但如果您必须从 100 多个条目中进行选择,或者您有一天需要这种容量,我不会使用它。

【讨论】:

  • 感谢您的选择 :)
【解决方案3】:

如果使用 PHP 5.6 或更高版本,

$input = [
    '2015-03-14' => 3,
    '2015-05-23' => 10 ,
    '2015-06-21' => 7 ,
    '2015-05-24' => 3,
    '2015-06-27' => 10 ,
    '2015-06-29' => 7
];

$start_date     = '2015-05-23';
$end_date       = '2015-06-29';

$sum = array_sum(array_filter($input, function($date) use ($start_date, $end_date){
                    return ( ( $date >= $start_date ) && ( $date <= $end_date ) );
                }, ARRAY_FILTER_USE_KEY));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多