草庐IT

php - 单个元素的引用行为与数组容器的引用状态分离?

coder 2024-04-28 原文

这是什么意思“换句话说,数组的引用行为是在逐个元素的基础上定义的;各个元素的引用行为与数组容器的引用状态分离。”

单个元素如何与数组容器的引用状态分离?我正在彻底doc我不明白这是什么意思?

<?php
/* Assignment of scalar variables */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c is not a reference; no change to $a or $b

/* Assignment of array variables */
$arr = array(1);
$a =& $arr[0]; //$a and $arr[0] are in the same reference set
$arr2 = $arr; //not an assignment-by-reference!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* The contents of $arr are changed even though it's not a reference! */
?>

最佳答案

我认为如果您使用一些 ASCII 艺术,您可能会更好地理解它:

第一个例子:

//Line 01
$a = 1;

----------

┌──────┐                       ┌─────┐      
│  $a  │   ─────────────────>  │  1  │
└──────┘                       └─────┘

//Line 02
$b = &$a;

----------

┌──────┐                       ┌─────┐      
│  $a  │   ─────────────────>  │  1  │
└──────┘                       └─────┘
                                  ^
┌──────┐                          │
│  $b  │   ───────────────────────┘ 
└──────┘                      

//Line 03
$c = $b;

----------

┌──────┐                       ┌─────┐      
│  $a  │   ─────────────────>  │  1  │
└──────┘                       └─────┘
                                  ^
┌──────┐                          │
│  $b  │   ───────────────────────┘ 
└──────┘                      

┌──────┐                       ┌─────┐      
│  $c  │   ─────────────────>  │  1  │
└──────┘                       └─────┘

//Line 04
$c = 7;

----------

┌──────┐                       ┌─────┐      
│  $a  │   ─────────────────>  │  1  │
└──────┘                       └─────┘
                                  ^
┌──────┐                          │
│  $b  │   ───────────────────────┘ 
└──────┘                      

┌──────┐                       ┌─────┐      
│  $c  │   ─────────────────>  │  7  │
└──────┘                       └─────┘

现在您可以看到,当您通过引用分配一个变量并更改它时,它也会更改另一个变量的值。这里以$a$b为例,如果给$b赋值5,$a也会指向到 5,反之亦然。

但是你没有通过引用将$b赋给$c(你通过值赋值做了一个正常),所以如果你改变的值$c 它不会改变 $b(或 $a)的值。

第二个例子:

//Line 01
$arr = array(1);

----------

┌───────────┐                       ┌─────┐      
│  $arr[0]  │   ─────────────────>  │  1  │
└───────────┘                       └─────┘

//Line 02
$a = &$arr[0];

----------

┌───────────┐                       ┌─────┐      
│  $arr[0]  │   ─────────────────>  │  1  │
└───────────┘                       └─────┘
                                       ^
┌──────┐                               │
│  $a  │   ────────────────────────────┘ 
└──────┘                      

//Line 03
$arr2 = $arr;

----------

┌───────────┐                       ┌─────┐      
│  $arr[0]  │   ─────────────────>  │  1  │
└───────────┘                       └─────┘
                                       ^
┌──────┐                               │
│  $a  │   ────────────────────────────┤ 
└──────┘                               │
                                       │
┌────────────┐                         │
│  $arr2[0]  │   ──────────────────────┘
└────────────┘                       

//Line 04
$arr2[0]++;

----------

┌───────────┐                       ┌─────┐      
│  $arr[0]  │   ─────────────────>  │  2  │
└───────────┘                       └─────┘
                                       ^
┌──────┐                               │
│  $a  │   ────────────────────────────┤ 
└──────┘                               │
                                       │
┌────────────┐                         │
│  $arr2[0]  │   ──────────────────────┘
└────────────┘     

现在是手册试图解释的行:

$arr2 = $arr;

即使您没有通过引用$arr2 来分配数组$arr,该数组仍然包含一个指向引用的元素!并且该引用仍将位于 $arr2 中,因此第二个数组的第一个元素也指向引用,如 $arr[0]$a 确实如此。


如果您看到通过引用分配数组和数组包含带引用的元素时的区别,您可能会更好地理解它:

通过引用分配的数组:

//Line 01
$arr1 = [1, 1, 1];

----------

┌─────────┐                            
│  $arr1  │         
└─────────┘                       
     │
     │
     └─────────> ┌────────────┐
                 │   Array    │          ┌─────┐  
                 │ container: │    ┌───> │  1  │
                 ├────────────┤    │     └─────┘
                 │    [0]     │ ───┘
                 ├────────────┤          ┌─────┐  
                 │    [1]     │ ───────> │  1  │
                 ├────────────┤          └─────┘
                 │    [2]     │ ───┐
                 └────────────┘    │     ┌─────┐ 
                                   └───> │  1  │
                                         └─────┘

//Line 02
$arr2 = &$arr1;

----------

┌─────────┐                            
│  $arr1  │         
└─────────┘                       
     │
     │
     └─────────> ┌────────────┐
                 │   Array    │          ┌─────┐  
                 │ container: │    ┌───> │  1  │
                 ├────────────┤    │     └─────┘
                 │    [0]     │ ───┘
                 ├────────────┤          ┌─────┐  
                 │    [1]     │ ───────> │  1  │
                 ├────────────┤          └─────┘
                 │    [2]     │ ───┐
     ┌─────────> └────────────┘    │     ┌─────┐ 
     │                             └───> │  1  │
     │                                   └─────┘
┌─────────┐                            
│  $arr2  │         
└─────────┘   

//Line 03 & 04
$arr2[0] = 2;
$arr2[1] = 2;

----------

┌─────────┐                            
│  $arr1  │         
└─────────┘                       
     │
     │
     └─────────> ┌────────────┐
                 │   Array    │          ┌─────┐  
                 │ container: │    ┌───> │  2  │
                 ├────────────┤    │     └─────┘
                 │    [0]     │ ───┘
                 ├────────────┤          ┌─────┐  
                 │    [1]     │ ───────> │  2  │
                 ├────────────┤          └─────┘
                 │    [2]     │ ───┐
     ┌─────────> └────────────┘    │     ┌─────┐ 
     │                             └───> │  1  │
     │                                   └─────┘
┌─────────┐                            
│  $arr2  │         
└─────────┘   

正如您在这里看到的,由于您通过引用将 $arr1 分配给了 $arr2,因此它们都指向同一个数组。

包含引用的数组:

//Line 01
$a = 1;

----------

┌──────┐                       ┌─────┐      
│  $a  │   ─────────────────>  │  1  │
└──────┘                       └─────┘

//Line 02
$arr3 = [&$a, 1, 1];

----------

┌──────┐                        ┌─────┐      
│  $a  │   ──────────────────>  │  1  │
└──────┘                        └─────┘            
                                   ^              
┌─────────┐                        │              
│  $arr3  │                        │              
└─────────┘                        │              
     │                             │              
     │                             │              
     └─────────> ┌────────────┐    │              
                 │   Array    │    │              
                 │ container: │    │              
                 ├────────────┤    │              
                 │    [0]     │ ───┘              
                 ├────────────┤          ┌─────┐  
                 │    [1]     │ ───────> │  1  │  
                 ├────────────┤          └─────┘  
                 │    [2]     │ ───┐              
                 └────────────┘    │     ┌─────┐  
                                   └───> │  1  │  
                                         └─────┘  




//Line 03
$arr4 = $arr3;

----------

┌──────┐                        ┌─────┐      
│  $a  │   ──────────────────>  │  1  │ <─────────┐
└──────┘                        └─────┘           │ 
                                   ^              │
┌─────────┐                        │              │
│  $arr3  │                        │              │
└─────────┘                        │              │
     │                             │              │
     │                             │              │
     └─────────> ┌────────────┐    │              │
                 │   Array    │    │              │
                 │ container: │    │              │
                 ├────────────┤    │              │
                 │    [0]     │ ───┘              │
                 ├────────────┤          ┌─────┐  │
                 │    [1]     │ ───────> │  1  │  │
                 ├────────────┤          └─────┘  │
                 │    [2]     │ ───┐              │
                 └────────────┘    │     ┌─────┐  │
                                   └───> │  1  │  │
                                         └─────┘  │
                                                  │
┌─────────┐                                       │
│  $arr4  │                                       │
└─────────┘                                       │
     │                                            │
     │                                            │
     └─────────> ┌────────────┐                   │
                 │   Array    │                   │
                 │ container: │                   │
                 ├────────────┤                   │
                 │    [0]     │ ──────────────────┘
                 ├────────────┤          ┌─────┐  
                 │    [1]     │ ───────> │  1  │
                 ├────────────┤          └─────┘
                 │    [2]     │ ───┐
                 └────────────┘    │     ┌─────┐ 
                                   └───> │  1  │
                                         └─────┘



//Line 03 & 04
$arr4[0] = 2;
$arr4[1] = 2;

----------

┌──────┐                        ┌─────┐      
│  $a  │   ──────────────────>  │  2  │ <─────────┐
└──────┘                        └─────┘           │ 
                                   ^              │
┌─────────┐                        │              │
│  $arr3  │                        │              │
└─────────┘                        │              │
     │                             │              │
     │                             │              │
     └─────────> ┌────────────┐    │              │
                 │   Array    │    │              │
                 │ container: │    │              │
                 ├────────────┤    │              │
                 │    [0]     │ ───┘              │
                 ├────────────┤          ┌─────┐  │
                 │    [1]     │ ───────> │  1  │  │
                 ├────────────┤          └─────┘  │
                 │    [2]     │ ───┐              │
                 └────────────┘    │     ┌─────┐  │
                                   └───> │  1  │  │
                                         └─────┘  │
                                                  │
┌─────────┐                                       │
│  $arr4  │                                       │
└─────────┘                                       │
     │                                            │
     │                                            │
     └─────────> ┌────────────┐                   │
                 │   Array    │                   │
                 │ container: │                   │
                 ├────────────┤                   │
                 │    [0]     │ ──────────────────┘
                 ├────────────┤          ┌─────┐  
                 │    [1]     │ ───────> │  2  │
                 ├────────────┤          └─────┘
                 │    [2]     │ ───┐
                 └────────────┘    │     ┌─────┐ 
                                   └───> │  1  │
                                         └─────┘

因此,正如您在此处看到的,即使您按值而非引用将 $arr3 分配给了 $arr4!该数组仍然包含该引用,它与 $a$arr3[0] 共享。

关于php - 单个元素的引用行为与数组容器的引用状态分离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34065928/

有关php - 单个元素的引用行为与数组容器的引用状态分离?的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  6. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  7. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  8. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

随机推荐