`
web001
  • 浏览: 99389 次
  • 性别: 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实现给二维数组中所有一维数组添加值的方法

    这个`$shop`变量是一个典型的二维数组,其中包含了三个一维数组。接下来,我们将演示两种方法来向这些一维数组添加新的值。 **示例1:引用循环变量的地址赋值** 在这个示例中,我们使用了引用符号`&`在`foreach`...

    javascript数组与php数组的地址传递及值传递用法实例

    在PHP中,数组是按值传递的,但这个“值”是数组的拷贝,而不是整个数组的引用。这意味着,当你在函数内部修改数组时,原始数组不会受到影响。以下是一个PHP的例子: ```php <?php $arr = array(3, 9, 4); function...

    一步一步学习PHP(8) php 数组

    然而,foreach循环有一个限制,即它不是直接操作原数组,而是在遍历前复制一份原数组的拷贝。这可能导致时间和空间的开销。因此,在遍历大数组或性能敏感的应用中,for循环可能更加合适。for循环可以让我们控制数组...

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

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

    PHP的引用详解

    对于数组来说,如果你将一个数组赋给另一个数组,那么这个赋值操作实际上创建了数组的一个副本。但是,如果你使用引用,那么两个数组变量将会指向同一个数组。因此,对一个数组的任何修改都会反映到另一个数组上。...

    PHP数组循环操作详细介绍 附实例代码

    在PHP编程中,数组是一种非常基础且重要的数据结构,它允许我们存储一组相关的数据。在处理数组时,循环操作是必不可少的,常见的两种循环方法是`foreach`和`while`。这两种循环各有特点,适用于不同的场景。 首先...

    phpf2f(php4 to php5)用于将php4代码移植到php5语法中

    PHP是世界上最受欢迎的服务器端脚本语言之一,从PHP4到PHP5的升级是其发展历程中的一个重要里程碑。PHP5引入了大量新特性,增强了类型检查,提升了性能,并修复了许多安全问题。然而,这同时也意味着那些基于PHP4的...

    PHP的性能测试全过程分享.doc

    在内部展开后就会是一个函数,从这个角度来看,PHP 函数在内部也是对应一个函数指针。 运行机制:PHP 的运行机制可以分成三个阶段:Parse、Compile 和 Execute。在 PHP 内部,本身也是存在编译的过程。并且据此产生...

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

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

    php扩展学习PDF

    通过阅读本书,你将能够提升到一个更高的层次,从内部视角去认识PHP,从而优化和定制化你的PHP应用。 在PHP的世界里,扩展是增强其功能和性能的重要手段。它们是用C语言编写的,可以直接与PHP引擎交互,提供原生...

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

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

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

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

    深入分析PHP引用(&)

    PHP中的引用是符号表别名的概念,其作用是允许两个或更多的变量名指向同一个变量内容。这与C语言的指针不同,因为引用是通过符号表来实现的,而不是通过内存地址。在Unix系统中,文件名可以被视为目录条目,而文件...

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

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

    PHP内核介绍及扩展开发指南

    在PHP中,多个变量可以共享同一个`zval`实例,通过`refcount`字段来跟踪引用的数量。当引用计数变为0时,`zval`将被垃圾回收器释放。 ##### 1.1.3 `zval`状态 `zval`中的`is_ref`字段表示当前`zval`是否是引用类型...

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

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

    php工程师考试试题

    - `array_add()` 并不是一个内置函数,可能是在某些自定义库中定义的。 - `array_push($users, 'john');` 也会向数组末尾添加'john'。 - `$users ||= 'john';` 是短路或运算符,如果$users为空则赋值为'john',...

Global site tag (gtag.js) - Google Analytics