整体实现逻辑介绍
  1.对查询数据做一个总体查询,需要根据查询自己主要业务逻辑数据.
  2.对总体查询数据和时间和币种类型做三部分数据处理.
  3.总体查询数据按照币种和日期组装二维数据对应得键值是价格.
  4.对时间做个数据处理主要是基于时间字段做个二维数组数据处理.
  5.对币种做个一维数组下标为数字,后期做数据处理需要使用for循环处理数据.
  6.统计汇总总和需要 3方法和5方法处理数据,在做数据逻辑汇总运算.
  7.统计每日不同币种需要 3方法和4方法处理数据,在做数据逻辑合并数组运算.   //30天收入走势图
public function actionIncome()
{
/* $l sql查询后数据结构(分组日期和币种)
array[0=>array[
'date' => '20180208',---日期
'fee' => '10.00', ---价格
'currency' => 'USD', ---币种类型
],1=>array[
'date' => '20180208',
'fee' => '20.00',
'currency' => 'TWD',
]];*/
$l = $this->incomeService->getDateIncomeList(); /* $type sql查询后数据结构(distinct币种字段)
array[0=>array[
'currency' => 'USD',
],1=>array[
'currency' => 'TWD',
]];*/
$type = $this->incomeService->getCurrency();
$number = count($type); /* $data_type 币种类型,数据处理过后结构
array[
0 => 'USD',
1 => 'TWD',
];*/
$data_type = array();
foreach ($type as $key=>$value) {
$data_type[$key] = $value['currency'];
} /* $data_total 统计每天不同币种价格,数据处理过后结构
array['USD'=>array[
'20180208' => '10.00',
'20180207' => '20.00',
],'TWD'=>array[
'20180208' => '10.00',
'20180207' => '20.00',,
]];*/
$data_total = array();
foreach ($l as $key=>$value) {
$data_total[$value['currency']][$value['date']] = $value['fee'];
} /* $total_sum 统计30天币种汇总,数据处理过后结构
array[
'USD' => '10.00',
'TWD' => '20.00',
];*/
$total_sum = array();
for($i=0; $i<$number; $i++){
$total_sum[$data_type[$i]] = empty($data_total[$data_type[$i]]) ? 0 : array_sum($data_total[$data_type[$i]]);
} /* $time 统计时间,数据处理过后结构
array['20180208'=>array[
'date' => '20180208',
],'20180207'=>array[
'date' => '20180207',
]];*/
$time = array();
foreach ($l as $key=>$value) {
$time[$value['date']]['date'] = $value['date'];
} /* $list 汇总合并每天不同币种,数据处理过后结构
array['20180208'=>array[
'date' => '20180208',
'USD' => '10.00',
'TWD' => '20.00',
],'20180207'=>array[
'date' => '20180207',
'USD' => '10.00',
'TWD' => '20.00',
]];*/
$list = array();
foreach ($time as $key=>$value){
$list[$key]['date'] = $key;
for($i=0; $i<$number; $i++){
$list[$key][$data_type[$i]] = empty($data_total[$data_type[$i]][$key]) ? 0 : $data_total[$data_type[$i]][$key];
}
} //Highcharts数据图表插件数据处理 ---(可以用百度等插件)
$chartsData = $this->searchChartsDataFormat($list); $this->render('income', array(
'list' => $list,
'chartsData' => $chartsData,
'total_sum' => $total_sum,
'number' => $number,
'data_type' => $data_type,
));
} /**
* [searchChartsData 数据图表使用]
* @param string $sql [description]
* @return [type] [array]
*/
public function searchChartsDataFormat($data){
if(!is_array($data))return array();
$day=$total_CNY=$total_THB=$total_TWD=$total_USD=array();
$result=array();
foreach ($data as $k => $v) {
$day[]='\''.$v['date'].'\'';
$total_CNY[]= $v['CNY'];
$total_THB[]= $v['THB'];
$total_TWD[]= $v['TWD'];
$total_USD[]= $v['USD'];
}
$result['date']=implode(',', array_reverse($day) );
$result['total_CNY']=implode(',', array_reverse($total_CNY) );
$result['total_THB']=implode(',', array_reverse($total_THB) );
$result['total_TWD']=implode(',', array_reverse($total_TWD) );
$result['total_USD']=implode(',', array_reverse($total_USD) );
return $result;
}
//前端数据处理和后端数据处理逻辑相似
<div id="incomeChat" style="width: 90%;height:50px;"></div> <div>
<div id="container" style="min-width:400px;height:400px"></div>
</div> <div class="table-responsive">
<table class="table table-bordered table-condensed">
<thead>
<tr class="xmsb-admin-table-head">
<th>日期</th>
<?php for($i=0; $i<$number; $i++){?>
<th><?php echo $data_type[$i]; ?></th>
<?php }?>
</tr>
</thead>
<tbody>
<?php foreach($list as $lv){?>
<tr>
<td><?php echo $lv['date']; ?></td>
<?php for($i=0; $i<$number; $i++){?>
<td><?php echo $lv[$data_type[$i]]; ?></td>
<?php }?>
</tr>
<?php }?>
<tr class="xmsb-admin-table-head">
<td>汇总</td>
<?php for($i=0; $i<$number; $i++){?>
<td><font size="2" color="red"><?php echo $total_sum[$data_type[$i]]; ?></font></td>
<?php }?>
</tr>
</tbody>
</table>
</div> <!-- jQuery -->
<script src="/public/bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src='/public/js/highcharts.js'></script>
<script type="text/javascript" src='/public/js/highcharts-zh_CN.js'></script>
<script type="text/javascript">
var chart = new Highcharts.Chart('container', {
title: { text: '',x: -20 },
subtitle: { text: '', x: -20 },
xAxis: {
categories: [<?php echo isset($chartsData['date'])?$chartsData['date']:''; ?>]
},
yAxis: {
title: { text: '30天价格统计' },
plotLines: [{ value: 0, width: 1, color: '#808080' }]
},
tooltip: {
valueSuffix: ''
},
legend: {
layout: 'vertical', align: 'right', verticalAlign: 'middle', borderWidth: 0
},
series: [{
name: 'CNY',
data: [<?php echo isset($chartsData['total_CNY'])?$chartsData['total_CNY']:""; ?>]
},{
name: 'THB',
data: [<?php echo isset($chartsData['total_THB'])?$chartsData['total_THB']:""; ?>]
}, {
name: 'TWD',
data: [<?php echo isset($chartsData['total_TWD'])?$chartsData['total_TWD']:""; ?>]
}, {
name: 'USD',
data: [<?php echo isset($chartsData['total_USD'])?$chartsData['total_USD']:''; ?>]
}]
});
</script>

上面代码实现下图功能

php 统计每天价格,货币种类,汇总得算法和数据处理 (后端和前段实现自动统计价格和币种类型)的更多相关文章

  1. 4.1.4 统计“锦途网”旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量

    查看本章节 查看作业目录 需求说明: 统计"锦途网"旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量 在 MySQL ...

  2. Oracle的自动统计信息不收集直方图的信息

    Oracle的自动统计信息不收集直方图的信息 在oracle9i中,默认的统计信息收集是不收集直方图信息的,也就是说默认的MOTHOD_OPT模式为FOR ALL COLUMNS SIZE 1 在10 ...

  3. Oracle错误:动态执行表不可访问,本会话自动统计被禁止,关闭自动统计之后的问题

    使用PL/SQL时, 每次第一次打开表的时候会提示"动态执行表不可访问,本会话的自动统计被禁止"的错误,一消息如下: V$SESSION,V$SESSTAT,V$STATNAME没 ...

  4. Oracle自动统计信息的收集原理及实验

    [日期:2014-11-21]来源:Linux社区  作者:stevendbaguo[字体:大 中 小] 从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATH ...

  5. PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案

    现象与提示: 第一次用PLSQL Developer连接数据库,若用sys用户登录并操作则正常,若用普通用户比如haishu登录并创建一个表则报错"动态执行表不可访问,本会话的自动统计被禁止 ...

  6. Oracl 动态执行表不可访问,本会话的自动统计被禁止

    oracle ---建立SQL窗体 写入 select * from tableA; 弹出错误窗口 : 动态执行表不可访问,本会话的自动统计被禁止.在执行菜单里你可以禁止统计,或在v$session, ...

  7. Oracle\PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案

    现象: 第一次用PLSQL Developer连接数据库,若用sys用户登录并操作则正常,若用普通用户比如haishu登录并创建一个表则报错“动态执行表不可访问,本会话的自动统计被禁止.在执行菜单里你 ...

  8. 使用 PLSQL 提示动态执行表不可访问,本会话的自动统计被禁止

    使用PLSQL,第一次执行表的select操作的时候,提示"动态执行表不可访问,本会话的自动统计被禁止",如上图: 这种问题,一看就是当前连接用户没有对sys用户下的表v$sess ...

  9. PLSQL报错:"动态执行表不可访问,本会话的自动统计被禁止"

      PLSQL报错:"动态执行表不可访问,本会话的自动统计被禁止" CreationTime--2018年7月16日19点26分 Author:Marydon 1.情景展示 2.解 ...

随机推荐

  1. JUnit的基本使用

    一些关于单元测试的理念:    单元测试并不能证明你的代码是正确的,只能证明你的代码是没有错误的. Keep bar green and keep your code cool    关于JUnit的 ...

  2. Vue-实现简单拖拽(自定义属性)

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  3. package和import语句_4

    J2SDK中主要的包介绍   java.lang—包含一些Java语言的核心类,如String.Math.Integer.System和 Thread,提供常用功能. java.awt—包含了构成抽象 ...

  4. Pikachu漏洞练习平台实验——越权漏洞(八)

    1.概述 由于没有对用户权限进行严格的判断 导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超管)范围内的操作 水行越权:A用户和B用户属于同一级别用户,但各自不能操作对方个人信息.A用户如 ...

  5. 学习mybaits用到的4张表

    items orderdetail orders user

  6. java Semaphore信号灯

    Semaphore实现的功能就类似2个公用电话,假如有10个人要打电话:那么只能2个人占有电话,8个需要等待.当2个人中 的任何一个人让开后,其中等待的另外8个人中又有一个人可以使用了等待的8个人中可 ...

  7. centos下Linux C语言MD5的使用

    在Linux C变成中用到MD5加密会使用到openssl库,下面给出的是一个简单的小Demo: #include <stdio.h> #include <openssl/md5.h ...

  8. K The Right-angled Triangles

    链接:https://ac.nowcoder.com/acm/contest/338/K来源:牛客网 题目描述 Consider the right-angled triangles with sid ...

  9. Js数据去重复,时间更换格式,cookie,localStorage和sessionStorage的使用等通用方法

    一,数组去重复 function unique(arr) { // 遍历arr,把元素分别放入tmp数组(不存在才放) var tmp = new Array(); for (var i in arr ...

  10. tensorflow的reshape操作tf.reshape()

    在处理图像数据的时候总会遇到输入图像的维数不符合的情况,此时tensorflow中reshape()就很好的解决了这个问题. 更为详细的可以参考官方文档说明: numpy.reshape reshap ...