首页 > 编程技术 > php

php返回json数据函数例子

发布时间:2016-11-25 17:22

json_encode()函数是一个在php中可以把数组转换成json格式的函数了,但json_encode函数对于英文是没有任何问题,如果碰到中文或编码有不致情况时会出现中文转换之后变空了,下面我就来从多方面来介绍php返回json数据应用与一些使用转换时的问题解决办法。

json_encode()函数用法。

echo json_encode(array('a'=>'bbbb','c'=>'ddddd');

这样就会生成一个标准的json格式的数据

 代码如下 复制代码

<?php

//需要执行的SQL语句
//单条
$sql="select id,name from tbl_user where id=1";
//多条数据
//$sql="select id,name from tbl_user";

//调用conn.php文件进行数据库操作
require('Conn.php');

//提示操作成功信息,注意:$result存在于conn.php文件中,被调用出来
if($result)
{

// $array=mysql_fetch_array($result,MYSQL_ASSOC);
 
  
 /*数据集

 $users=array();
 $i=0;
 while($row=mysql_fetch_array($result,MYSQL_ASSOC)){

   echo $row['id'].'-----------'.$row['name'].'</br>';
   $users[$i]=$row;
   $i++;

 }
  echo json_encode(array('dataList'=>$users));

 */

 /*单条数据*/

 $row=mysql_fetch_row($result,MYSQL_ASSOC);
 
 echo json_encode(array('jsonObj'=>$row));
}

mysql_free_result($result);
//释放结果
mysql_close();
//关闭连接

?>

上面是数据库生成json数据了

单条数据:{"jsonObj":{"id":"1","name":"lmw"}}

多条数据:{"dataList":[{"id":"1","name":"lmw"},{"id":"2","name":"xxj"},{"id":"3","name":"xxxj"}]}


现在很多情况下,我们需要程序返回一个Json格式的结果,比如:

 代码如下 复制代码

{
"UserKeyGetResponse":
{"RequestName":"e99e6d63e8c712d7699f52978a","api_key_value":"41954dd9b1cb6a95802eab6810"},
"error_response":
{"code":"NO_ERROR","msg":"获取系统参数成功"}
}

可以将结果写成这样的数组形式:
$respon = array('UserKeyGetResponse' => array('RequestName' => $api_request_name, 'api_key_value' => $api_key_value),
'error_response' => array('code' => 'NO_ERROR', 'msg' => '获取系统参数成功'));

代码

 代码如下 复制代码

function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }
        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
    $recursive_counter--;
}

g:
$error_respon = array('code' => 'ERROR_MSG_MISS', 'msg' => '消息不存在');
echo JSON($array);

结果为:
{"code":"ERROR_MSG_MISS","msg":"消息不存在"}
客户端就可以解析这个结果了,当然错误码要用数字代替。

这样就好多了我们显示的直接是中文了,当然显示那个16进制的编码也是没有问题的哦。

下面来简单的介绍在php中get_meta_tags()、CURL与user-agent信息对比情况,如果你对于这篇文章有兴趣可进入参考学习。

get_meta_tags()函数用于抓取网页中<meta name="A" content="1"><meta name="B" content="2">形式的标签,并装入一维数组,name为元素下标,content为元素值,上例中的标签可以获得数组:array('A'=>'1', 'b'=>'2')。其他<meta>标签不处理,并且此函数只处理到</head>标签时截止,之后的<meta>也不再继续处理,不过<head>之前的<meta>还是会处理。

user-agent是浏览器在向服务器请求网页时,提交的不可见的头信息的一部分。头信息是一个数组,包含多个信息,比如本地缓存目录,cookies等,其中user-agent是浏览器类型申明,比如IE、Chrome、FF等。

今天在抓取一个网页的<meta>标签的时候,总是得到空值,但是直接查看网页源代码又是正常的,于是怀疑是否服务器设置了根据头信息来判断输出。先尝试使用get_meta_tags()来抓取一个本地的文件,然后这个本地文件将获取的头信息写入文件,结果如下(其中替换成了/,方便查看):

 代码如下 复制代码

array (
  'HTTP_HOST' => '192.168.30.205',
  'PATH' => 'C:/Program Files/Common Files/NetSarang;C:/Program Files/NVIDIA Corporation/PhysX/Common;C:/Program Files/Common Files/Microsoft Shared/Windows Live;C:/Program Files/Intel/iCLS Client/;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/Program Files/Intel/Intel(R) Management Engine Components/DAL;C:/Program Files/Intel/Intel(R) Management Engine Components/IPT;C:/Program Files/Intel/OpenCL SDK/2.0/bin/x86;C:/Program Files/Common Files/Thunder Network/KanKan/Codecs;C:/Program Files/QuickTime Alternative/QTSystem;C:/Program Files/Windows Live/Shared;C:/Program Files/QuickTime Alternative/QTSystem/; %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;',
  'SystemRoot' => 'C:/Windows',
  'COMSPEC' => 'C:/Windows/system32/cmd.exe',
  'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
  'WINDIR' => 'C:/Windows',
  'SERVER_SIGNATURE' => '',
  'SERVER_SOFTWARE' => 'Apache/2.2.11 (Win32) PHP/5.2.8',
  'SERVER_NAME' => '192.168.30.205',
  'SERVER_ADDR' => '192.168.30.205',
  'SERVER_PORT' => '80',
  'REMOTE_ADDR' => '192.168.30.205',
  'DOCUMENT_ROOT' => 'E:/wamp/www',
  'SERVER_ADMIN' => 'admin@admin.com',
  'SCRIPT_FILENAME' => 'E:/wamp/www/user-agent.php',
  'REMOTE_PORT' => '59479',
  'GATEWAY_INTERFACE' => 'CGI/1.1',
  'SERVER_PROTOCOL' => 'HTTP/1.0',
  'REQUEST_METHOD' => 'GET',
  'QUERY_STRING' => '',
  'REQUEST_URI' => '/user-agent.php',
  'SCRIPT_NAME' => '/user-agent.php',
  'PHP_SELF' => '/user-agent.php',
  'REQUEST_TIME' => 1400747529,
)

果然在数组中没有HTTP_USER_AGENT这个元素,apache在向另外一台服务器发送请求的时候是没有UA的。之后查了一下资料,get_meta_tags()函数没有伪造UA的能力,所以只能使用其他办法解决了。

后来使用CURL来获取,就获取到了网页,不过使用上稍微麻烦一点,首先伪造UA,获取之后在使用正则表达式分析<meta>
伪造办法:

 代码如下 复制代码

// 初始化一个 cURL
$curl = curl_init();

// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, 'http://localhost/user-agent.php');

// 设置是否将文件头输出到浏览器,0不输出
curl_setopt($curl, CURLOPT_HEADER, 0);

// 设置UA,这里是将浏览器的UA转发到服务器,也可以手动指定值
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

// 设置cURL 参数,要求结果返回到字符串中还是输出到屏幕上。0输出屏幕并返回操作结果的BOOL值,1返回字符串
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

// 运行cURL,请求网页
$data = curl_exec($curl);

// 关闭URL请求
curl_close($curl);

// 处理获得的数据
var_dump($data);

我们知道php中有三个删除空格的函数trim() rtrim() ltrim() 但我测试之后发现这三个函数无法删除所有空格,那么我们要如何删除字符串所有空格?下面一起来看看。

我先是使用trim() rtrim() ltrim() 来删除空格

 代码如下 复制代码

<?php
echo trim(" 空 格 ")."<br>";
echo rtrim("空   格 ")."<br>";
echo ltrim(" 空格")."<br>";
?>

这样结果不是我们想要的中间空格无法删除,后来仔细查看了这三个函数的用法

trim() 去除一个字符串两端空格,
rtrim() 是去除一个字符串右部空格,
ltrim() 是去除一个字符串左部空格。

明白人看出没有删除中间空格的能力啊,那怎么办百度一下吧,人有说用正则替换函数,我们就试一下吧

看到有人这么说

 代码如下 复制代码

$str = ” This line contains\tliberal \r\n use of   whitespace.\n\n”;
$str = trim($str);// 首先去掉头尾空格
$str = preg_replace(’/\s(?=\s)/’, ‘’, $str);// 接着去掉两个空格以上的
$str = preg_replace(’/[\n\r\t]/’, ‘ ‘, $str);// 最后将非空格替换为一个空格

使用上面的例子可以去掉所有多余的空格,这样就搞写了哦。。

php查找文件大小的原理是遍历目录然后再利用filesize来计算文件大小,然后我们再加一判断就可以了,下面整理了一些例子。

我们先来看遍历目录

 代码如下 复制代码

function tree($directory)
{
 $mydir = dir($directory);
 echo "<ul>n";
 while($file = $mydir->read())
 {
  if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!=".."))
  {
   echo "<li><font color="#ff00cc"><b>$file</b></font></li>n";
   tree("$directory/$file");
  }
  else
  echo "<li>$file</li>n";
 }
 echo "</ul>n";
 $mydir->close();
}
//开始运行

echo "<h2>目录为粉红色</h2><br>n";
tree("./nowamagic");

这样只是把所有目录下的文件显示了,但我们要判断大小需加上round(filesize($cpath)/1024,1)函数了,这样我们获取大小之后就可以显示文件大小了。

 代码如下 复制代码

<?php
header("Content-Type:text/html;charset=gbk");
set_time_limit(0);
$dirpath=dirname(__FILE__);
//bytes
$limitByte=1024*110;
//这里改成你合适的查找文件最低大小,单位为字节。1024*100表示 1024*100字节,即100KB
$arrRes=$arrTmp=array();
showMaxFile($dirpath,$limitByte);
function showMaxFile($path,$limitByte){
global $arrRes;
$h=opendir($path);
if($h){
while (false !== ($file = readdir($h))) {
if($file!='.' && $file!='..'){
$cpath=$path.'/'.$file;
if(is_dir($cpath)){
showMaxFile($cpath,$limitByte);
}else{
if(filesize($cpath) > $limitByte){
$arrRes[]=array($cpath,round(filesize($cpath)/1024,1));
//echo "<p>{$cpath}<br />".(filesize($cpath) / 1024)."KB</p>";
}
}
}
}
 
}
closedir($h);
}
foreach($arrRes as $k=>$v){
$arrTmp[$k]=$v[1];
}
arsort($arrTmp);
foreach($arrTmp as $k=>$v){
echo "<p>".str_replace($dirpath,'',$arrRes[$k][0])."<br />".$arrRes[$k][1]."</p>";
}
?>

最后给大家附一个字节计算函数,这个可以转换

 

 代码如下 复制代码
//字节数转换成带单位的
/* 原理是利用对数求出欲转换的字节数是1024的几次方。
 * 其实就是利用对数的特性确定单位。
*/
function size2mb($size,$digits=2){ //digits,要保留几位小数
  $unit= array('','K','M','G','T','P');//单位数组,是必须1024进制依次的哦。
  $base= 1024;//对数的基数
  $i   = floor(log($size,$base));//字节数对1024取对数,值向下取整。
  return round($size/pow($base,$i),$digits).' '.$unit[$i] . 'B';
}
在利用百度工具作一个小测试时提示我们需要设置静态内容缓存时间了,我自己没有服务器权限操作,只能从其它方面入手了,自己学习php的我搜索后发现可以使用header函数来实现浏览器缓存页面的时间哦,具体如下。

设置静态内容缓存时间

 代码如下 复制代码

$interval = 60 * 60 * 6; // 6 hours
header ("Last-Modified: " . gmdate ('r', $max));
header ("Expires: " . gmdate ("r", ($max + $interval)));
header ("Cache-Control: max-age=$interval");

我们把上面这段代码加到php文件开头处,下面来给大家详解说有一下这四行代码

如我的代码

 代码如下 复制代码
$interval = 60 * 60 * 6; // 6 hours
header ("Last-Modified: " . gmdate ('r', $max));
header ("Expires: " . gmdate ("r", ($max + $interval)));
header ("Cache-Control: max-age=$interval");
$aid = intval( isset( $_POST['aid'] )?$_POST['aid']:0 );
if( ! $aid )
{
 echo '未定义广告';
}
else if( $aid ==1 )
{
 echo '加载广告内容';
}


第一行:$interval  告诉你设置6个小时了,这里大家可自定哦。
第二行:向客户端浏览器发送一个Last-Modified请求,这个会根据gmdate的参数r来调用对应的日期。
第三行:设置Expires过期时间了
第四行:设置Cache-Control 的 max-age=$interval日期了。

再测试结果为优秀了

 

php 设置静态内容缓存时间
标签:[!--infotagslink--]

您可能感兴趣的文章: