整体实现逻辑介绍
  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. MapReduce(3): Partitioner, Combiner and Shuffling

    Partitioner: Partitioning and Combining take place between Map and Reduce phases. It is to club the ...

  2. pjhp实现使用redis来存储session数据

    #设置php处理session的方式为redis,并配置redis的访问地址(因为在redis中绑定的访问地址为127.0.0.1,所以就没有设置访问密码,如果需要请自行搜索)#因为不想修改php.i ...

  3. python学习第十三天元组创建和操作方法

    有人问,有了列表,为什么还要有元组呢,到底元组是什么,元组是不可变的有序的列表,一旦创建不能改变,那些地方用到元组呢,小编知道可以应用到数据库连接. 1,元组的创建 n1 = () 元组用的是小括号 ...

  4. Jmeter JAVA请求入门

    一.Jmeter完成一个java请求实现方法 两种实现方式: 实现JavaSamplerClient接口 继承AbstractJavaSamplerClient抽象类 二.使用AbstractJava ...

  5. 关于JSON.stringify()与JSON.parse()

    一.JSON.stringify()与JSON.parse()的区别 JSON.stringify()的作用是将js值转换成JSON字符串,而JSON.parse()是将JSON字符串转换成一个对象. ...

  6. 【学习总结】Python-3-字符串函数-strip()方法

    参考: 菜鸟教程-Python3-Python字符串-strip()方法 语法: str.strip([chars]); 参数: chars -- 移除字符串头尾指定的字符序列. 返回值: 返回移除字 ...

  7. React入门-JSX和虚拟dom

    1.JSX理解 举例: const element = <h1>Hello, world!</h1>; 这被称为 JSX,是一个 JavaScript 的语法扩展.建议在 Re ...

  8. combox系列问题集

    visual studio崩溃 你是不是经常会遇到一编辑combox,visual studio就会立马崩溃.一直都无法理解是什么原因,然后后来发现居然是因为有道的截屏翻译,关掉截屏翻译就好了. co ...

  9. java截取某个字符之前或者之后的字符串

    String str = lly://enterVideoList?result={jsonString}; 截取?之前字符串 String str1=str.substring(0, str.ind ...

  10. 创建一个java项目并部署到weblogic服务器

    转自:https://blog.csdn.net/krystal_sl/article/details/52847953 新建一个项目的步骤 打开eclipse,右键点击new–>java pr ...