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.解 ...
随机推荐
- SQLServer2008查询时对象名无效
情况一:如果表名是关键字,查询时把表名括起来,不作为关键字使用 情况二:看左上角显示的是否是master,这是数据库的默认系统库,点选这个改成自己的即可
- pandas基础(第一章(一))
摘要:通过简单例子,了解功能.以此作为基点,在工作中不断深入 1.设置需要显示的行列宽度(显示的最大列数和最大行数,其余部分用.....表示) 设置显示多少行多少列 import pandas as ...
- 用递归方法求n!
题目: 编写一个程序,输入n,求n!(用递归的方式实现). public class test { public static long fac(int n){ if(n<0){ return ...
- MyBatis-Spring的sqlSessionTemplate
转自:http://www.cnblogs.com/yhtboke/p/5611375.html SqlSessionTemplate SqlSessionTemplate是MyBatis-Sprin ...
- Map3
map切片: 切片的数据类型如果是map,则我们称为 slice of map, map切片,这样使用则map个数就可以动态变化了. 案例演示:要求:会用一个map来记录monster的信息 name ...
- Java_1.Java符号体系
Java符号包含五类:标识符.关键字.常量及字面量.运算符.分隔符 1.标识符 定义:用于标明程序中元素的名字,如类.方法和变量 命名规则: ·由字母.数字.下划线(_)和美元符号($)构成的字母序列 ...
- 最短路 dijkstra算法
题目 给定n个点的带权有向图,求从1到n的路径中边权之和最小的路径. dijkstra实现方法 用dist[i]表示i这个点到原点的最短距离,一开始初始化为无穷大,然后将原点设为0. 用ok[i]表示 ...
- flex布局解说和属性
1. flex-direction 规定当前DIV下面的子元素是横向布局还是纵向布局 row 默认值,横向布局相当于float:left column 纵向,相当于DIV默认的垂直方向 2.justi ...
- 解决Linux下编译.sh文件报错 “[: XXXX: unexpected operator”
本人经常在Linux通过编译 .sh文件来生成工程,之前一直都没问题,代码一直都没变,但是今天编译的时候,却提示错误:
- H5中滚动到底部的事件
问题:在H5中,我们有这样的需求:例如有列表的时候,滚动到底部时,需要加载更多. 解决方案:可以采用window的滚动事件进行处理 分析:如果滚动是针对整个屏幕而言的(不针对于某个界面小块),那么这个 ...