【问题标题】:Is there a version of the PHP array that is pass-by-reference?是否存在通过引用传递的 PHP 数组版本?
【发布时间】:2012-03-27 09:58:57
【问题描述】:

我问这个是因为我正在使用一个递归函数来生成一个大型数组树,而数组的传递复制方面完全让我头疼。我尝试过使用 ArrayObject,但这确实是一个对象,不是吗? array_keys 类型的数组函数都不能使用它,json_encode 不明白它是一个数组。

我想要一个 PHP array 的版本,它在感觉、气味和外观上都像普通数组,但是是通过引用传递的。 PHP中有类似的东西吗?


哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇我很清楚 & 符号,但这正是我试图避免。正如我的问题所指定的 (^) 我正在寻找一个通过引用传递的 PHP 数组版本默认情况下

【问题讨论】:

  • 我相信这不是你想要的,但它可能会对你有所帮助webreflection.blogspot.com/2009/09/…
  • @Codemonkey:默认情况下,没有本质上是通过引用传递的 PHP Array 版本。您必须告诉 PHP 如何处理数组并停止投票给正确的答案。
  • 这可能是真的,也可能不是,但你的答案仍然不正确
  • 听起来你的代码太复杂了。如果您无法通过引用手动传递,我看不出自动完成它对您有什么帮助,行为仍然是相同的。
  • 因为我必须经常检查我传递的是对数组的引用还是对引用的引用。在这成为一种痛苦之前,它不需要经过很多次。显然,有了一个object,我无论如何都不必担心这些。因此;一个表现得像一个对象的数组将是完美的解决方案

标签: php arrays pass-by-reference


【解决方案1】:

我想要一个感觉、气味和外观都像的 PHP 数组版本 普通数组,但是是通过引用传递的。有没有类似的 在 PHP 中?

不,PHP 中没有类似的东西。

【讨论】:

    【解决方案2】:

    Json 编码应该能够传递对象。但是如果你出于某种原因需要一个数组,你不能在编码为json之前使用对象然后将其转换为数组?

    <?php
    $object = (object)array("number"=>1);
    function addToTen($object){
        if($object->number<10){
            $object->number++;
            addToTen($object);
        }
    }
    addToTen($object);
    echo json_encode((array)$object);
    //echoes {"number":10} with or without casting it as an array
    ?>
    

    当然,您也可以将数组包装在一个对象中,如下所示:

    $object = new stdClass;
    $object->a = array();
    function fillUpArray($object){
        if(count($object->a)<10){
        $object->a[] = "someValue";
            fillUpArray($object);
        }
    }
    fillUpArray($object);
    echo json_encode($object->a);
    //echoes ["someValue","someValue","someValue","someValue","someValue","someValue","someValue","someValue","someValue","someValue"]
    

    我必须承认,虽然我不完全明白你在这里想要完成的事情:S

    【讨论】:

      【解决方案3】:

      是的,请参阅 PHP 手册页:http://php.net/manual/en/language.references.pass.php

      【讨论】:

      • 这不是PHP数组的传递引用版本,这只是传递指针而不是值的一种方式
      【解决方案4】:

      完全停止使用 &references,在 php 中它们很快就会变得很麻烦,(与 C 指针不同,它几乎是透明的,唯一检查你是否实际使用引用的方法是给它分配垃圾并检查它的效果在树上),你似乎不愿意处理这种微妙的程度。

      (显然也不用ArrayObject 包装它)

      你知道对象是引用吗?
      对象包装你的树和你的生活的每个方面都会立即变得不那么悲惨。

      【讨论】:

      • 我的最终树必须是一个数组,除非我想重写json_encode。我很清楚对象是引用,但我几乎完全肯定数组的低级对象版本在各方面都像普通数组一样,除了它将通过引用传递。
      【解决方案5】:

      我不知道您要求的 PHP 中有任何此类内置功能。此外,您非常不愿意使用引用。嗯...您可以向 PHP 开发团队发送请求,以在 PHP v6 中包含这些内容,以及应该出现的 unicode,我们都会很高兴:)。

      但是,您可以使用一个类并将您的初始数组分配给其中一个类变量,然后对其进行处理并在递归后将其取回。不确定这是否可行,但无论如何它是:

      <?php
      class noReference {
          public $myData;
      
          public function __construct( $data ) {
             $this->myData = $data; // this is your initial array.
          }
      
          // this function works on the myData array and changes it.
          public function myRecursiveFunction() {
             // your code here
             $this->myRecursiveFunction(); // called as per your logic
             // your code here
          }
      
          public function getData() {
             return $this->myData;
          }
      
          public function __destruct() {
             unset( $this->myData );
          }
      }
      
      $data = array(/*WHATEVER_PLEASES_YOU*/);
      $noref = new noReference( $data );
      // this will be your recuresive function
      $noref->myRecursiveFunction();
      
      //your data here
      $result = $noref->getData();
      ?>
      

      让我知道这是否有效。干杯!

      【讨论】:

        【解决方案6】:

        您可以通过在参数中添加&amp;-sign 来强制php 通过引用传递内容。 read the documentation 了解更多信息。

        【讨论】:

        • 我知道,但是有太多来回的“传递”和对所有数组的引用,我无法绕开它。这就是为什么我正在寻找更简单的解决方案
        猜你喜欢
        • 2015-07-04
        • 2011-05-24
        • 2011-03-09
        • 1970-01-01
        • 2016-12-12
        • 2021-09-11
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        相关资源
        最近更新 更多