php 数组复制/拷贝/克隆方案对比大全,如何序列化变量并还原?
发布于 作者: 苏南大叔 来源: 程序如此灵动~![](https://newsn.net/usr/themes/panda/assets/img/icon/stop.png)
上一篇文章里面,苏南大叔刚刚说过了普通的
php
数组是不需要
clone
关键字的。但是,这一篇文章里面,苏南大叔就要继续说明
php
数组克隆的方案,是不是有些前后言语不一致呢。这里苏南大叔澄清一下,本文中的数组,也是特殊的数组,即数组中的某个元素是
object
的情况。本文中的数组克隆的案例,剧情更加扑朔迷离。欲知详情,请继续查看本文中的内容。
![苏南大叔到底是谁?!? - php-clone 苏南大叔:php 数组复制/拷贝/克隆方案对比大全,如何序列化变量并还原? - php-clone](https://newsn.net/usr/img/water/a2/a2bba6f1f1fca5eb.png)
那么,
php
数组如何才能复制/拷贝/克隆呢?(名字不一样,其实都是同样的目的,对吧?)请查看苏南大叔独家总结的本文内容。本文测试环境:
php7.2
/
mac
。
涉及到php
序列化的两个函数是:serialize($变量)
和unserialize($序列化的结果)
。
基本逻辑描述
再次强调一下,本文中的数组,并非是普通的常见
php
数组,数组中的某个元素是个
object
。数组定义如下:
class test {
public $b;
public function __construct($v) {
$this->b = $v;
$b1 = [["初始值a", "b", "c"], new test("初始值b")];
// ...
// 这个位置将会出现一系列的数组clone方案,但是其中有些是正确的,有些是错误的。
// ...
$b1[0][0] = "修改值aa";
$b1[1]->b = "修改值bb";
// ...
// 一系列数组clone方案中,到底谁对谁错呢?
// ...
b1
Array
[0] => Array
[0] => 修改值aa
[1] => b
[2] => c
[1] => test Object
[b] => 修改值bb
)
正确的方案
判断正确的标准,就是修改原版的数组后,克隆的数组并不发生变化。以这个标准看的话,那么可选的正确方案,如下所示:
$b2 = array_copy($b1);
$b3 = unserialize(serialize($b1));
$b4 = json_decode(json_encode($b1));
其中的自定义函数
array_copy
定义如下:
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 369 苏南大叔:php 数组复制/拷贝/克隆方案对比大全,如何序列化变量并还原? - 369](https://newsn.net/usr/img/water/79/796cc544701c2b02.png)
错误的方案
这些错误的方案,也是流传于网上的,经过实践,证明是有问题的,大家可以引以为戒。
$b5 = $b1;