关于PHP处理Json数据的例子
最近工作需要在原来静态看板(大屏)页面的基础上,实现数据的动态展示,而且需要定时刷新。
接到任务后就马不停蹄的开始修改页面:
显然这个需求最好的解决方法就是用Ajax对后台数据进行定时请求,在前端页面进行刷新
基本的效果是这个样子的:

对后台数据进行遍历,循环展示在表格上。
老实讲,做个Ajax向后端请求数据确实easy,但是刺激的是没有后台交互的模块给我拿来测试,作为实习生的我又不可能招呼其他人来帮助我完成测试。
所以还是得靠自己。
接下来我只能凭借我做博客系统积攒的一些PHP经验写出一个后台模块,独立完成测试工作。
代码如下:
<?php
	//连基础元数据都是我自己拍脑袋模拟出来的,有点崇拜我寄几了呢!
	$json = '{
		"data": [
			{
				"TOP_LINE": 10000,
				"BOTTOM_LINE": 500,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 20000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":3000,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "外轮星"
			},
			{
				"TOP_LINE": 30000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 40000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":3000,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "外星轮"
			},
			{
				"TOP_LINE": 50000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 60000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 20000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 20000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 20000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 20000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":5121,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "实轴"
			},
			{
				"TOP_LINE": 20000,
				"BOTTOM_LINE": 5000,
				"NOW_NUMBER":3000,
				"THIS_MOUTH_TAKEIN":0,
				"THIS_MOUTH_TAKEOUT":0,
				"LAST_MOUTH_TAKEIN":0,
				"LAST_MOUTH_TAKEOUT":0,
				"RAW_MATERIAL_BATCH_NUMBER_": "SDS-7120",
				"OWN_ADRESS": "GEM",
				"MATERIAL_NAME_": "外星轮"
			}
		],
		"success": true,
		"total": 2
	}';
	//Ajax传过来的参数,page是页码,listnum是每页展示的数据条数
	$page = $_GET['page'];
	$listNum = $_GET['listNum'];
	//这个函数蛮重要的json_decode();因为实际上$json我们定义的是个String ,这个函数将它转化成json格式的数据
	$jsondata=json_decode($json);
	//定义头文件,防止乱码
	header("Content-Type: text/html; charset=UTF-8");
	//print_r($jsondata);
	//这样我们就可以拿到我们要的数组了
	$arr = $jsondata->data;
	//echo $arr;
	//下面是为了拆分后台数据所做的努力了:$sign是判断总数据可以分成多少页
	$sign = intval(count($arr)/$listNum)+1;
	//如果传过来的页码大于总页码,不好意思,智能取模了,这样才能一直循环下去
	if ($page >= $sign) {
		$page = $page % $sign;
	}
	//array_slice(array,start,length),php截取数组的方法
	$toget = array_slice($arr,$page*$listNum,$listNum);
	//返回数据
	echo json_encode($toget); 
?>
顺便说一下我们老大给我派发任务的时候的一个知识点:
- 我原来的思路是用一次Ajax请求将后台数据全部拿到,然后在前端分页循环展示(这可能是作为前端开发者常有的思维,),这个思路看似没有问题。
 - 因为我们的系统是要部署到工业生产现场的,网络延迟和实时数据 是两个不得不考虑的问题,那么这个时候就必须减少每次请求的负载,还要考虑数据的实效性。
 - 这样一来显然通过小批量多频次请求数据更靠谱。
 - 所以有了现在的解决方案。
 
为了方便读者理解整个思路,附上Ajax请求部分代码:
window.onload=function(){
	var page = 0 ;
	var listNum = 6;
	console.log('000');
	getAjax(page,listNum);
	//getAjax(page,listNum);
	setInterval(function(){
		page++;
		//getAjax(page,listNum);
		console.log(page);
		getAjax(page,listNum);
	},3000);
	function getAjax(page,listNum){
		var args = {"page":page,"listNum":listNum,"time":new Date()};
		$.getJSON('../json/storage_rawInventeryView.php',args,function(result){
			//console.log('123');
			var arr = result;
			console.log(arr);//调试数据
				//改变颜色专用变量
				var markup = true;
				var color;
				//调整数据的顺序
			//循环遍历json,将获取到的数据插入到页面上
			$('tbody').empty();
			for (var i = 0; i < arr.length ; i++) {
				$('tbody').append('<tr></tr>');
				markup = !markup;
				if(markup){
					color = '#58D5FF';
				}else{
					color = '#fff';
				}
				//调整数据的顺序
				var turnList = ["RAW_MATERIAL_BATCH_NUMBER_","MATERIAL_NAME_","TOP_LINE","BOTTOM_LINE","NOW_NUMBER","LAST_MOUTH_TAKEOUT","THIS_MOUTH_TAKEIN","THIS_MOUTH_TAKEOUT","LAST_MOUTH_TAKEIN","OWN_ADRESS"];
				for(var q = 0;q < turnList.length; q++){
					//console.log(turnList[q]);
					if(arr[i][turnList[q]]=='是'){
						var tdHtml = '<td style="word-wrap: break-word;text-align:center;font-size:2.5vw;color:#1DFC8A;" class="ng-binding ng-scope">合格</td>';
					}else if(arr[i][turnList[q]]=='否'){
						var tdHtml = '<td style="word-wrap: break-word;text-align:center;font-size:2.5vw;color:#F3423C;" class="ng-binding ng-scope">退货</td>';
					}else{
						var tdHtml = '<td style="word-wrap: break-word;text-align:center;font-size:2.5vw;color:'+color+';" class="ng-binding ng-scope">'+arr[i][turnList[q]]+'</td>';
					}
					//console.log(tdHtml);
					$('tbody>tr:eq('+i+')').append( tdHtml);
				}
			}
		});
	}
}
												
											关于PHP处理Json数据的例子的更多相关文章
- php返回json数据函数例子
		
json_encode()函数用法. echo json_encode(array('a'=>'bbbb','c'=>'ddddd'); 这样就会生成一个标准的json格式的数据 代码如下 ...
 - Highcharts获取json数据展现pie饼图
		
实际上很多时候图表展现的数据都是从服务器端获取,现在来做一个简单的异步获取json数据的例子. 服务器端用Servlet3.0实现,JSP页面通过jquery异步请求json数据提供给Highchar ...
 - boke例子: freermarker:在使用ajax传递json数据的时候多出冒号
		
boke例子: freermarker:在使用ajax传递json数据的时候多出冒号 json数据是用JSON.stringify()格式化的数据,然后用ajax传递,发现数据多出一个冒号:, 后来度 ...
 - 使用Gson转换json数据为Java对象的一个例子
		
记录工作中碰到的一个内容. 原料是微信平台的一个接口json数据. { "errcode" : 0, "errmsg" : "ok", &q ...
 - C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)
		
第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...
 - 利用Python进行数据分析(2) 尝试处理一份JSON数据并生成条形图
		
一.JSON 数据准备 首先准备一份 JSON 数据,这份数据共有 3560 条内容,每条内容结构如下: 本示例主要是以 tz(timezone 时区) 这一字段的值,分析这份数据里时区的分布情况. ...
 - MVC使用ajax异步刷新时怎样输出从后台中传过来的JSON数据
		
前言 这几天在学习MVC使用AJAX异步刷,因为是新手.所以在js中传参数到后台以及后台返回数据到前台怎么接受,怎么前台遍历出JSON数据都开始不知道,相信新手在使用时跟我一样会遇到,这里我就和大家分 ...
 - ASP.NET提取多层嵌套json数据的方法
		
本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...
 - JSON数据的使用
		
JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...
 
随机推荐
- Java中使用C3P0连接池
			
先看官网给的范例: import java.sql.*; import javax.naming.*; import javax.sql.DataSource; import com.mchange. ...
 - javascript 调试 & console.table()
			
通过console.table()打印数组.对象 一般我们都是通过console.log()打印数组或对象,但console.table()打印数组.对象更直观: console.table(empi ...
 - go 实现struct转map
			
从python转golang大约一个月了,对struct的使用还算顺手,但是很多时候还是会想念python的便捷.比如同时遍历两个字典,python使用for (x, y) in zip(map1, ...
 - quicksort(java版)
			
相信大家都知道几种排序算法,比如说冒泡排序,选择排序,插入排序等等,这些个算法都不是很难,自己多多理解理解就能掌握了,而今天我们要谈的就是重头戏就是快速排序. 引用大牛的思想来对排序算法解释一下.(文 ...
 - Linux 下常用的Shell 命令
			
英文原文链接:https://www.lopezferrando.com/30-interesting-shell-commands/ 1. 监控命令(每2秒运行一次) watch "ls ...
 - 学习Timer定时器
			
原文地址:http://www.cppblog.com/ivenher/articles/19969.html setTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器.计时器 ...
 - ThinkPHP5零基础搭建CMS系统(一)
			
了解学习thinkphp5应该是2016年年底的事情,当时还没有接触过thinkphp3版本,觉得通过手册直接上手学习tp5蛮轻松的,现在从零记录下,搭建可扩展的CMS. 1.ThinkPHP环境搭建 ...
 - Docker快速入门(二)
			
上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...
 - CentOS6系列系统启动常见故障排查与解决方法
			
情景一.内核文件损坏 /boot/vmlinuz-2.6.32-642.el6.x86_64 内核文件 1.故障现象 2.解决方法:挂载光盘,进入rescue(救援)模式 3.选择--English- ...
 - java   I/O (一)
			
java 的I/O类基本上可以分为6大类:二进制的输入,二进制的输出,文本的输入,文本的输出,FILTER类和其他对文件操作的工具类. Java的I/O类主要在java.io的包里,其中两个主要的流为 ...