php 统计每天价格,货币种类,汇总得算法和数据处理 (后端和前段实现自动统计价格和币种类型)
整体实现逻辑介绍
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 统计每天价格,货币种类,汇总得算法和数据处理 (后端和前段实现自动统计价格和币种类型)的更多相关文章
- 4.1.4 统计“锦途网”旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量
查看本章节 查看作业目录 需求说明: 统计"锦途网"旅游线路平均价格,并采用尽可能多的方式将该价格赋给用户会话变量 @avg_short_price,并输出该变量 在 MySQL ...
- Oracle的自动统计信息不收集直方图的信息
Oracle的自动统计信息不收集直方图的信息 在oracle9i中,默认的统计信息收集是不收集直方图信息的,也就是说默认的MOTHOD_OPT模式为FOR ALL COLUMNS SIZE 1 在10 ...
- Oracle错误:动态执行表不可访问,本会话自动统计被禁止,关闭自动统计之后的问题
使用PL/SQL时, 每次第一次打开表的时候会提示"动态执行表不可访问,本会话的自动统计被禁止"的错误,一消息如下: V$SESSION,V$SESSTAT,V$STATNAME没 ...
- Oracle自动统计信息的收集原理及实验
[日期:2014-11-21]来源:Linux社区 作者:stevendbaguo[字体:大 中 小] 从Oracle Database 10g开始,Oracle在建库后就默认创建了一个名为GATH ...
- PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案
现象与提示: 第一次用PLSQL Developer连接数据库,若用sys用户登录并操作则正常,若用普通用户比如haishu登录并创建一个表则报错"动态执行表不可访问,本会话的自动统计被禁止 ...
- Oracl 动态执行表不可访问,本会话的自动统计被禁止
oracle ---建立SQL窗体 写入 select * from tableA; 弹出错误窗口 : 动态执行表不可访问,本会话的自动统计被禁止.在执行菜单里你可以禁止统计,或在v$session, ...
- Oracle\PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案
现象: 第一次用PLSQL Developer连接数据库,若用sys用户登录并操作则正常,若用普通用户比如haishu登录并创建一个表则报错“动态执行表不可访问,本会话的自动统计被禁止.在执行菜单里你 ...
- 使用 PLSQL 提示动态执行表不可访问,本会话的自动统计被禁止
使用PLSQL,第一次执行表的select操作的时候,提示"动态执行表不可访问,本会话的自动统计被禁止",如上图: 这种问题,一看就是当前连接用户没有对sys用户下的表v$sess ...
- PLSQL报错:"动态执行表不可访问,本会话的自动统计被禁止"
PLSQL报错:"动态执行表不可访问,本会话的自动统计被禁止" CreationTime--2018年7月16日19点26分 Author:Marydon 1.情景展示 2.解 ...
随机推荐
- 认识requests库,以及安装方法
1.学习requests库有什么意义 1)对我来说,我是测试人员,我用它来解决HTTP接口自动化测试 2)写爬虫需要用到requests 3)如果是开发人员,需要些接口,了解requests有助于掌握 ...
- JavaScript高级程序设计(第3版) 第四章(变量、作用域和内存问题)
4.1 基本类型和引用类型的值 1.基本类型的值是(简单的数据段),引用类型的值是(保存在内存中的对象). 基本类型的值在内存中占据固定大小的空间,因此被保存在栈中.(lifo ...
- 06:(h5*)Vue第六天
目录 1:iView 2: element 3: vuex 正文 1:i-view 1:装包 npm install view-design --save 2:导包 import ViewUI f ...
- Node.js实战3:加载一组模块。
有时候,希望通过一个require来加载一个目录下的相关文件. 注:这个方法通常被用来作为组织web应用的架构技巧. 为达到这个目的,需要如此操作: 例:建立一个目录,在此目录中创建一个index.j ...
- Netty基础-BIO/NIO/AIO
同步阻塞IO(BIO): 我们熟知的Socket编程就是BIO,每个请求对应一个线程去处理.一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作).阻塞的原因在于:操 ...
- ToString()的简单介绍
1.在某一个类中重写该类的toString()方法,是为了方便打印该类实例中的内容.
- python------生产者消费者模型 和 管道
一.为什么要使用生产者和消费者? 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程,在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才 ...
- hdu1423 最长公共上升子序列
题目传送门 Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- 【问题解决方案】关于Python中的语句 ' %matplotlib inline '
跟进小项目#GirlsInAI#-可视化时遇到的语句,之前没有遇到过 在Stack Overflow上看到了一个解释: IPython有一组预定义的"魔术函数",您可以使用命令行样 ...
- OC学习--继承
1.什么是继承? 继承是指一个对象直接使用另一对象的属性和方法. 继承可以使得子类具有父类的各种属性和方法,而不是再次编写相同的代码.在子类继承父类的同时,可以重新定义某些属性,并重写某些方法, 即 ...