PHP的serialize序列化数据与JSON格式化数据的例子

 更新时间:2016年11月25日 17:04  点击:1580
serialize与json在实现应用中我们都会需要进行一些数据转换操作了,这里整理了在PHP的serialize序列化数据与JSON格式化数据的例子,我们一起来学习一下。

PHP的serialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,而JSON则是一种更轻、更友好的用于接口(AJAX、REST等)数据交换的格式。 其实两者都是以一种字符串的方式来体现一种数据结构。那么他们之间又有什么区别呢?

serialize序列化

我们在一些老的WEB系统中可能会看到在数据库或在文本文件中存储着一大串貌似有着特殊含义的字符串文本内容。我们仔细看会发现它具有数据类型和结构等信息,但是它并不容易人工阅读,它只适合PHP程序读取。PHP的serialize将数组进行了序列化并存储。我们假设有这样一个数组:
 
$arr = array(
    "0" => array(
        "gameName" => "德乙",
        "homeName" => "比勒费尔德",
        "guestName" => "不伦瑞克",
        "endTime" => "2015-08-21"
    ),
    "1" => array(
        "gameName" => "英超",
        "homeName" => "水晶宫",
        "guestName" => "阿斯顿维拉",
        "endTime" => "2015-08-22"
    )
);

我们要将这个数组内容存储在数据库或者文本文件中,以便其他地方读取。
 
$serialize = serialize($arr);
echo $serialize;

我们使用PHP的serialize将数组进行序列化,输出以下结果:
 
a:2:{i:0;a:4:{s:8:"gameName";s:6:"德乙";s:8:"homeName";s:15:"比勒费尔德";s:9:"guestName";s:12:"不伦瑞克";s:7:"endTime";s:10:"2015-08-21";}i:1;a:4:{s:8:"gameName";s:6:"英超";s:8:"homeName";s:9:"水晶宫";s:9:"guestName";s:15:"阿斯顿维拉";s:7:"endTime";s:10:"2015-08-22";}}

以上输出的结果看上去比较复杂,其实也很简单,它说明的就是一些数据类型和结构。
a:2说明这是个有两个元素的数组(array);
i:0指序列索引;
a:4指有4个字段
s:8:"gameName"说明这是有8个字符的字符串(string)
实际开发中我们只将序列化后的数据进行存储,并不要去关心存储的格式和以及字段意思。如果要将序列化后的数据恢复成数组,则使用unserialize()函数即可。
 
print_r(unserialize($serialize));

以上代码可以打印出数组。
JSON数据解析
我们知道,PHP操作JSON可以使用json_encode()和json_decode()两个函数。json_encode()可以将数组转换成json格式的文本数据,它方便存储和读取,而json_decode()可以直接将json数据转换成数组,方便调用。
 
$jsonencode = json_encode($arr);
echo $jsonencode;
输出:
 
[{"gameName":"\u5fb7\u4e59","homeName":"\u6bd4\u52d2\u8d39\u5c14\u5fb7","guestName":"\u4e0d\u4f26\u745e\u514b","endTime":"2015-08-21"},{"gameName":"\u82f1\u8d85","homeName":"\u6c34\u6676\u5bab","guestName":"\u963f\u65af\u987f\u7ef4\u62c9","endTime":"2015-08-22"}]

很显然,使用JSON后,数据空间要比serialize少,输出的结果中中文字符串经过编码,仔细看是键值对应,便于人工识别,而且关键是JSON格式的数据方便其他语种读取并识别,所以有人说它是XML替代品。JSON格式的数据能和WEB前端JS完成异步交互过程。如果要将json还原成数组,可以使用json_decode()函数。
 
print_r(json_decode($jsonencode,true));

关于JSON的应用有兴趣的同学可以参考本站文章:PHP中JSON的应用
总结
PHP的serialize将数组序列化后是便于存储,而JSON格式的数据不仅便于存储还能跟其他语言如javascript读取。它们在性能上可能会有细微区别,如果前后端交互使用比较多的话建议使用JSON,结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互功能。

preg_replace 就是用来替换字符了但是有时你会发现一些html代码使用preg_replace 函数替换不掉了,下面我们一起来看一个例子吧,具体如下所示。


例子

评论表情使用的标签<emt>1</emt>至<emt>60</emt>。

对应的图片路径/Public/images/face/1.gif至/Public/images/face/60.gif。


实现方法是使用preg_replace函数完成评论表情的显示。

<?php
$message='文章写的太好了<emt>3</emt><emt>34</emt>';
$message=preg_replace('#<emt>(\d{1,2})</emt>#', '<img src="/Public/images/face/${1}.gif" />', $message);
echo $message;
?>

例子

1.把html元素全部去掉,或者保留某几个html标签


<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "/n";
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>

结果为(去掉了注释):

<blockquote>Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a></blockquote>2.相反,只去掉某一个html标签

<?php
function strip_only($str, $tags, $stripContent = false) {
    $content = '';
    if(!is_array($tags)) {
        $tags = (strpos($str, '>') !== false ? explode('>', str_replace('<', '', $tags)) : array($tags));
        if(end($tags) == '') array_pop($tags);
    }
    foreach($tags as $tag) {
        if ($stripContent)
             $content = '(.+</'.$tag.'[^>]*>|)';
         $str = preg_replace('#</?'.$tag.'[^>]*>'.$content.'#is', '', $str);
    }
    return $str;
}
$str = '<font color="red">red</font> text';
$tags = 'font';
$a = strip_only($str, $tags); // red text
$b = strip_only($str, $tags, true); // text
?>

PHP用foreach循环大量数据时候,出使内存耗尽然后报错误,这时,我们可以使用PHP非缓冲模式查询数据库,本文来具体讲解。

如果我们在执行PHP程序出现下面代码时:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

显然,我们的最大内存已经耗尽。因为我正在开发的这个程序是用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。

我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。

这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。

PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。

相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。

很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。

对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。

非缓冲查询方法一: mysqli

<?php 
$mysqli  = new mysqli("localhost", "my_user", "my_password", "world"); 
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT); 
 
if ($uresult) { 
   while ($row = $uresult->fetch_assoc()) { 
       echo $row['Name'] . PHP_EOL; 
   } 
} 
$uresult->close(); 
?>



非缓冲查询方法二: pdo_mysql

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 
 
$uresult = $pdo->query("SELECT Name FROM City"); 
if ($uresult) { 
   while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
       echo $row['Name'] . PHP_EOL; 
   } 
} 
?>



非缓冲查询方法三: mysql

<?php 
$conn = mysql_connect("localhost", "my_user", "my_pass"); 
$db   = mysql_select_db("world"); 
 
$uresult = mysql_unbuffered_query("SELECT Name FROM City"); 
if ($uresult) { 
   while ($row = mysql_fetch_assoc($uresult)) { 
       echo $row['Name'] . PHP_EOL; 
   } 
} 
?>

本人用的是mysqli面向对象的方式。

前面介绍一篇GRIDFS文件存储到MONGODB数据库中了,下面来看一个MONGODB GRIDFS存取文件PHP示例,希望这个例子对各位有用。


最近项目需要用到MongoDB存取文件,这里有个简单的PHP示例:


public function run(){
 //初始化gridfs
 $m = new MongoClient(); // 连接
 $db = $m->selectDB("excel");
 //dump($m);exit;
 //$collection = $db->testexcel;
 $grid = $db->getGridFS(); //取得gridfs对象
 
 //gridfs有三种方式存储文件
 //第一种直接存储文件
 $id = $grid->storeFile(dirname(__FILE__)."/EmptyAction.class.php");
 echo $id;
 
 //获取文件
 $file = $grid->findOne(array('_id'=>$id)); //以_id为索引取得文件
 //header('Content-type: image/png'); //输出图片头
 dump($file);
}

在MongoDB命令行中查看所有上传的文件:

1.show dbs

列出所有数据库

2.use excel

进入名为excel的数据库

3.db.fs.files.find()

列出所有上传的文件

通过GridFS上传获取文件,它默认是传到fs.files这个collection中。GridFS有两个集合,”fs.chunks”和”fs.files”,前者是分片存储,后者是普通文件存储,适合小于4M的文件。

我们知道GridFS是一种将大型文件存储在MongoDB的文件规范了,下文我们就一起来看一篇PHP实现GRIDFS存储文件到MONGODB的教程,具体步骤如下。


一般情况采取第一种方法,直接传文件,第二种方法适合生成的数据不用保存到本地再上传而是直接以二进制存到MongoDB,第三种方式是直接把表单上传的文件存进MongoDB.


//初始化gridfs
$conn = new Mongo(); //连接MongoDB
$db = $conn->photos; //选择数据库
$grid = $db->getGridFS(); //取得gridfs对象
 
//gridfs有三种方式存储文件
//第一种直接存储文件
$id = $grid->storeFile("./logo.png");
 
//第二种存储文件二进制流
$data = get_file_contents("./logo.png");
$id = $grid->storeBytes($data,array("parame"=>’附加参数将随图片一起存入’));
 
//第三种保存直接表单提交的文件$_FILES
$id = $grid->storeUpload('upfile');
//相当于
$id = $grid->storeFile($_FILES[‘upfile’][‘tmp_name’]);
 
//--------------以上是保存图片--下面开始读取图片----------------
 
//保存成功后返回$id = md5字符串
$logo = $grid->findOne(array('_id'=>$id)); //以_id为索引取得文件
header('Content-type: image/png'); //输出图片头
echo $logo ->getBytes(); //输出数据流

这种感觉就是文件流形式保存到数据库了,让小编觉得觉得就是把图片文件保存到数据库一样的道理了。

[!--infotagslink--]

相关文章

  • Jackson反序列化@JsonFormat 不生效的解决方案

    这篇文章主要介绍了Jackson反序列化@JsonFormat 不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-10
  • C#格式化数字字符串的方法

    这篇文章主要为大家详细介绍了C#格式化数字字符串的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • prettier自动格式化去换行的实现代码

    这篇文章主要介绍了prettier自动格式化去换行的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-26
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • 解决Golang json序列化字符串时多了\的情况

    这篇文章主要介绍了解决Golang json序列化字符串时多了\的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-24
  • 微信小程序 时间格式化(util.formatTime(new Date))详解

    这篇文章主要介绍了微信小程序 时间格式化(util.formatTime(new Date))详解的相关资料,这里附实例,一目了然很容易解决,需要的朋友可以参考下...2016-11-22
  • java序列化与反序列化的使用方法汇总

    序列化是一种对象持久化的手段,普遍应用在网络传输、RMI等场景中,这篇文章主要给大家总结介绍了关于java序列化与反序列化的使用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2021-07-29
  • vue.js实现价格格式化的方法

    这里分享一个常用的价格格式化的一个方法,在电商的价格处理中非常的实用,具体实现代码大家参考下本文...2017-05-27
  • 关于VSCode格式化JS自动添加或去掉分号的问题

    这篇文章主要介绍了VSCode格式化JS自动添加或去掉分号的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-10-12
  • protobuf对象二进制序列化存储(详解)

    下面小编就为大家带来一篇protobuf对象二进制序列化存储(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#小数点格式化用法小结

    这篇文章主要介绍了C#小数点格式化用法,结合实例形式分析了C#小数点格式化运算的常用函数与相关使用技巧,需要的朋友可以参考下...2020-06-25
  • jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用

    这篇文章主要介绍了jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用的相关资料,需要的朋友可以参考下...2016-01-25
  • 详解PHP序列化反序列化的方法

    经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值,其实就是一个序列化的过程,在需要用到这些数据库的时候会进行一个反序列化过程,就是将这个字符串再还原成他原来的数据结构。下面说说php 如何进行数据...2015-10-30
  • C#实现的json序列化和反序列化代码实例

    这篇文章主要介绍了C#实现的json序列化和反序列化代码实例,本文讲解了两种实现方法,并直接给出代码示例,需要的朋友可以参考下...2020-06-25
  • C#实现的序列化通用类实例

    这篇文章主要介绍了C#实现的序列化通用类,实例分析了C#序列化与反序列化操作相关技巧,需要的朋友可以参考下...2020-06-25
  • Jackson 反序列化时实现大小写不敏感设置

    这篇文章主要介绍了Jackson 反序列化时实现大小写不敏感设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-29
  • C#实现JSON字符串序列化与反序列化的方法

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。...2020-06-25
  • C#中Serializable序列化实例详解

    这篇文章主要介绍了C#中Serializable序列化,以实例形式详细讲述了系列化的技术及各种序列化方法,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • 用序列化实现List<T> 实例的深复制(推荐)

    下面小编就为大家带来一篇用序列化实现List<T> 实例的深复制(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#实现复杂XML的序列化与反序列化

    这篇文章主要介绍了C#实现复杂XML的序列化与反序列化的方法,是非常实用的一个技巧,需要的朋友可以参考下...2020-06-25