`
web001
  • 浏览: 96269 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

php如何真“拷贝”一个数组

    博客分类:
  • PHP
 
阅读更多

本文翻译改编自:http://stackoverflow.com/questions/1532618/is-there-a-function-make-a-copy-of-a-php-array-to-another

原文链接:http://www.tjwzjs.cn/news/knowledge/2012/1218/function-copy-a-array-to-another.html

 

问:“如何在php中实现数组的拷贝?php数组是基于值拷贝还是引用拷贝呢?”

 

谢谢 @jamcode 的提醒,我对原文理解犯了一个很大的错误,附原文:

 

Is there a function make a copy of a PHP array to another?

I have been burned a few times trying to copy PHP arrays. I want to copy an array defined inside an object to a global outside it.

在PHP中如何实现这种拷贝呢?

下面写一个简单的拷贝代码:

$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);

当我们运行这段代码时,得到

array(0) {
}

可见,我们修改了B的值,但是A却没有相应的改变。于是我们换一段代码试试:

$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);

此次的输出结果变成了:

object(stdClass)#1 (1) {
  ["foo"]=>
  int(42)
}

ArrayObject 的行为虽然是一个数组,但是他确实是一个对象,它是通过传递引用实现赋值的。

 

6
4
分享到:
评论
8 楼 nakupanda 2012-12-18  
deep copy = recursive copy 吧

see jQuery.extend()
7 楼 jamcode 2012-12-18  
哎,建议你不要再凭主观臆断去理解这些概念了。
千万不要再写出一篇解释那个“值和引用”了。光“值和引用”这个概念,不少有经验的程序员都躺枪,解释了错了。楼主你就别再解释啦。解释了只会误导别人的。


web001 写道
jamcode 写道
唉,楼主我服了你了。
你英语差成这样还敢翻译。
原文里面压根就没提到deep copy这个词。机器翻译都不会翻译出“深拷贝”这个词的吧。你怎么会把它和深拷贝联系在一起的呢?

I 服了 You!

web001 写道
jamcode 写道
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

文章是翻译的:http://stackoverflow.com/questions/1532618/is-there-a-function-make-a-copy-of-a-php-array-to-another


我不是机器翻译的,纯个人理解。不是深拷贝,也不是浅拷贝。是值和引用

6 楼 web001 2012-12-18  
jamcode 写道
唉,楼主我服了你了。
你英语差成这样还敢翻译。
原文里面压根就没提到deep copy这个词。机器翻译都不会翻译出“深拷贝”这个词的吧。你怎么会把它和深拷贝联系在一起的呢?

I 服了 You!

web001 写道
jamcode 写道
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

文章是翻译的:http://stackoverflow.com/questions/1532618/is-there-a-function-make-a-copy-of-a-php-array-to-another


In PHP arrays are assigned by copy, while objects are assigned by reference. 以后一定会注意,呵呵。
5 楼 web001 2012-12-18  
jamcode 写道
唉,楼主我服了你了。
你英语差成这样还敢翻译。
原文里面压根就没提到deep copy这个词。机器翻译都不会翻译出“深拷贝”这个词的吧。你怎么会把它和深拷贝联系在一起的呢?

I 服了 You!

web001 写道
jamcode 写道
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

文章是翻译的:http://stackoverflow.com/questions/1532618/is-there-a-function-make-a-copy-of-a-php-array-to-another


我不是机器翻译的,纯个人理解。不是深拷贝,也不是浅拷贝。是值和引用
4 楼 jamcode 2012-12-18  
唉,楼主我服了你了。
你英语差成这样还敢翻译。
原文里面压根就没提到deep copy这个词。机器翻译都不会翻译出“深拷贝”这个词的吧。你怎么会把它和深拷贝联系在一起的呢?

I 服了 You!

web001 写道
jamcode 写道
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

文章是翻译的:http://stackoverflow.com/questions/1532618/is-there-a-function-make-a-copy-of-a-php-array-to-another

3 楼 web001 2012-12-18  
jamcode 写道
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

谢谢 @jamcode 提醒,果然错的离谱,原文不是这个意思,是我误解了。
2 楼 web001 2012-12-18  
jamcode 写道
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

文章是翻译的:http://stackoverflow.com/questions/1532618/is-there-a-function-make-a-copy-of-a-php-array-to-another
1 楼 jamcode 2012-12-18  
楼主我对你彻底无语了。
你有水军的吧?这个文章都有6个人顶?

错的离谱。
连深Copy的概念都搞不清。

PHP中数组在传递时,都是进行了的深拷贝。除非使用"&" $b=&$a;才不会拷贝。



引用

深拷贝是面向对象编程的一个很重要的概念,它说的是,把一个数组或者对象拷贝给另外一个,这种拷贝不仅仅是把数组A的值赋值给了数组B,而是数组A和数组B指向了同一个空间,也就是,B就是A的别名。


妹啊。深拷贝是面向对象编程的一个很重要的概念?是北大青鸟的培训老师这样讲过的还是哪个伪JAVA牛讲过的?

我怀疑楼主是机器人发的帖子,错得这么离谱法子,发这种误导人的帖子。我想点“举报”按钮了。

相关推荐

    PHP语言基础知识(超详细).md

    涵盖了PHP语言的基础知识,...php移动、拷贝和删除文件 这篇文章从PHP的基础知识讲起,循序渐进地介绍了PHP的语法、数据类型、流程控制、函数、数组等核心知识点。对于初学者来说,这个教程可以作为入门学习的必备资料。

    PHP FCKeditor_2.6.6 瘦身精简版 带重命名上传+实例使用说明

    一、精简说明: 删除所有"_"开头的文件和文件夹 ... // 创建一个fckeditor对象 $oFCKeditor->BasePath=$BasePath; $oFCKeditor->Value=$fileinfo; // 设置表单初始值 $oFCKeditor->Create(); // 调用类中方法,必须 ?>

    CI辅助函数 PHP自动获取用户地理位置信息的函数 支持淘宝, 新浪等多个IP数据库

    在 $autoload['helper'] 这个数组里面增加 ip_helper.php辅助函数的加载, 注意,只需要添加 _helper.php 前面的文件名即可, 如 ip ,即表示加载 ip_helper.php, 如果有多个辅助函数需要加载的话,直接真加一个数组值...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    史上最全韩顺平毕业班视频------这里只有10月份,8,9,11月份在另外一个文件下。 传智播客PHP就业班视频课程列表 8-11 1.html介绍 html运行原理① 8-11 2.html运行原理② html文件基本结构 html元素和属性 8-11 3....

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    史上最全韩顺平毕业班视频------这里只有9月份,8,10,11月份在另外一个文件下。 传智播客PHP就业班视频课程列表 8-11 1.html介绍 html运行原理① 8-11 2.html运行原理② html文件基本结构 html元素和属性 8-11 3....

    (全)传智播客PHP就业班视频完整课程

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

    PHP中for与foreach的区别分析

    注意: 除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此数组指针不会被 each() 结构改变,对返回的数组单元的修改也不会影响原数组。 1. 自php5起,foreach 还可能遍历对象的属性。...

    开发PHP扩展详细教程

    将php源码包解开,我的版本的php-4.4.4,转到源码包中的ext目录建立一个新的目录叫icbc,然后在icbc目录下touch三个文件config.m4、php_icbc.h、icbc.c 2.建立config.m4 内容如下: PHP_ARG_ENABLE(icbc, ...

    史上最全传智播客PHP就业班视频课,8月份视频

    史上最全韩顺平毕业班视频------这里只有8月份,9,10,11月份在另外一个文件下。 传智播客PHP就业班视频课程列表 8-11 1.html介绍 html运行原理① 8-11 2.html运行原理② html文件基本结构 html元素和属性 8-11 3....

    php学习笔记

    拷贝文件 54 文件和文件夹的创建和删除 55 画图 56 画饼状图 56 案例一:投票柱状统计图 57 案例二:验证码 59 GD库 60 PHP和数据库 64 mysql扩展库 64 一.创建一张用户表 64 二.查询数据库中的表 64 三....

    PHP高性能编程经验分享.txt

    //这个是值传递,这里虽然是值传递,但PHP为了提升性能采用COPY-ON-WRITE【写时拷贝】,也就是说两个变量的地址指向的是同一地方。 $b="4546";//此时才会申请一块新的内存来赋值。 再举三个例子以便于理解: $a=...

    利用浏览器的Javascript控制台调试PHP程序

    与JAVA相比,没有一个好的服务器端调试工具是其限制之一。通常我们都是在PHP代码中添加echo、var_dump等语句,将变量、数组的值显示在浏览器中来达到调试的目的。 现在,越来越多的浏览器都有了开发这工具或者...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    解答学生问题--一个ip绑定多个域名 8-19 2.php运行过程时序图 php书写规范 8-19 3.php基本语法介绍 php数据类型介绍 8-19 4.整型细节说明 8-19 5.布尔细节 浮点数细节 字符串细节 算术运算符① 8-19 6.算术运算符② ...

    Nagoya.php.Vol9:我试图解决Nagoya.php vol9的编程问题

    Nagoya.php vol9 编程问题问题笔记TreeBuilder,我不确定在某处已经成为子元素的元素中添加更多子元素(孙子元素)是否会反映出来,但是我写就正确的反映出来了没关系…… (可能得益于对象的浅拷贝区)我意识到很难...

    PHP语言开发常见问题解决办法入门总结.docx

    实践指南:充分利用PHP内置的字符串处理函数如trim(), strpos(), 数组处理函数如array_filter(), array_map(),以及日期和时间处理函数,减少重复造轮子。 代码优化 提高性能:减少冗余代码,对循环、查询等耗时...

    VicWord 一个纯php的分词

    //$arr 是一个数组 每个单元的结构[词语,词语位置,词性,这个词语是否包含在词典中] 这里只值列出了词语 $arr = $fc->getShortWord('北京大学生喝进口红酒,在北京大学生活区喝进口红酒'); //北京|大学|生喝|进口|...

    PHP中使用foreach和引用导致程序BUG的问题介绍

    PHP 引用有些类似 C 语言指针, 但一些重要的特性和 C 语言指针不一样, 如果不注意, 会导致程序 BUG. foreach 操作的是数组或对象的拷贝, 但 PHP5, 可以使用引用操作对象元素本身

    shell:大概是PHP最强大的SHELL执行类了

    简而言之大概是PHP最强大的SHELL执行类了系统兼容PHP ...example.php这是一个使用shell.class.php实现的webshell工具,用于shell类演示。授权说明使用本类库你唯一需要做的就是把LICENSE文件往你用到的项目中拷贝一份。

    PHP7新特性foreach 修改示例介绍

    一、foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。现在开始,不再如此,见下面代码。。 $array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($...

Global site tag (gtag.js) - Google Analytics