【问题标题】:Display item totals for week or month显示一周或一个月的项目总计
【发布时间】:2018-04-20 13:55:16
【问题描述】:

我有一个球员和分数数组,数组看起来像:-

$a = array(
    array('date' => '09-04-2018','item' => 'player 1', 'score' => '1'),
    array('date' => '09-04-2018','item' => 'player 2', 'score' => '2'),
    array('date' => '10-04-2018','item' => 'player 1', 'score' => '1'),
    array('date' => '10-04-2018','item' => 'player 2', 'score' => '2'),
    array('date' => '16-04-2018','item' => 'player 1', 'score' => '3'),
    array('date' => '16-04-2018','item' => 'player 2', 'score' => '4'),
    array('date' => '17-04-2018','item' => 'player 1', 'score' => '3'),
    array('date' => '17-04-2018','item' => 'player 2', 'score' => '4')
);

为简单起见,我只显示了 2 个玩家“玩家 1”和“玩家 2”,实际上有多个玩家

我想显示一个表格,但可以选择按天、周或月显示分数,我需要将其放入数组中,以便将其传递给数据表。

所以一周的新数组看起来像:-

$c = array(
    array('date' => '15','item' => 'player 1', 'score' => '2'),
    array('date' => '15','item' => 'player 2', 'score' => '4'),
    array('date' => '16','item' => 'player 1', 'score' => '6'),
    array('date' => '16','item' => 'player 2', 'score' => '8')
);

我可以根据日期添加分数,但这是添加所有玩家,而不是让每个玩家分开。

这是我目前所拥有的:-

<?php 
$view = 0;
$a = array(
    array('date' => '09-04-2018','item' => 'player 1', 'score' => '1'),
    array('date' => '09-04-2018','item' => 'player 2', 'score' => '2'),
    array('date' => '10-04-2018','item' => 'player 1', 'score' => '1'),
    array('date' => '10-04-2018','item' => 'player 2', 'score' => '2'),
    array('date' => '16-04-2018','item' => 'player 1', 'score' => '3'),
    array('date' => '16-04-2018','item' => 'player 2', 'score' => '4'),
    array('date' => '17-04-2018','item' => 'player 1', 'score' => '3'),
    array('date' => '17-04-2018','item' => 'player 2', 'score' => '4')
);

$c =[];
foreach ($a as $i => $b)
{
    $date = new DateTime($b['date']);
    $player = $b['item'];
    $score = $b['score'];

    $key = $i;

    if ($view == 1) //$view - 0 = day, 1 = week, 2 = month
    {
        $key = array_search($date, array_column($c, 'date'));
        if ($key !== false)
        {
            $score= $c[$key]['score'] + $score;
        }
        else
        {
            $key = count($c);
        }
    }
    $c[$key]['date'] = $date->format("W");
    $c[$key]['item'] = $player;
    $c[$key]['score'] = $score;
  }

echo '<pre>';
print_r($c);
echo '<pre>';

 ?>

【问题讨论】:

  • $view 等于 0
  • 是的,我的错误......即使它是 1,我的代码也没有按照我想要的方式执行
  • 那么你的问题在哪里?你有错误信息吗?输出是否与您的预期不同?
  • @WilliamPerron 问题是我无法让数组以我想要的方式显示,我可以将所有相同的日期或所有相同的玩家相加,但不能将每个玩家的所有分数相加

标签: php arrays date datetime


【解决方案1】:

我认为这会对您有所帮助。
这将创建一个新数组,其中包含球员 -> 周 -> 得分,可以很容易地“按原样”求和或回显。

//Week example

Foreach($arr as $val){
    $res[$val['item']][date("W", strtotime($val['date']))][] = $val['score'];
}
Var_dump($res);

https://3v4l.org/V9Dk9

通过更改日期函数,您可以使其以不同的方式构建数组。
假设您想要月份,请将“W”更改为 n、m、M 或 F。
https://3v4l.org/MUjYV

编辑:
这应该输出总和。

Foreach($res as $player => $time){
    Foreach($time as $timeperiod => $score){
        Echo $player. " ". $timeperiod ." " .  array_sum($score) ."\n";
    }
}


https://3v4l.org/2h30B


https://3v4l.org/2NAqX

相同的代码只是日期字符不同。

【讨论】:

  • 感谢@Andreas 的帮助,但我怎样才能轻松地用这种类型的数组求和?
  • @Chris 抱歉一直在照顾家人。我现在更新了答案
  • 确实总和,但它给出的输出与我得到的相似,仅在第一周求和 - item 1 15 2 item 2 15 4
  • 感谢@Andreas 这让我头疼了一段时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2019-09-04
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多