【问题标题】:How can I use array-references inside arrays in PHP?如何在 PHP 中的数组中使用数组引用?
【发布时间】:2023-03-09 17:06:02
【问题描述】:

我希望能够做到以下几点:

$normal_array       = array();
$array_of_arrayrefs = array( &$normal_array );

// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
end( $array_of_arrayrefs )["one"] = 1; // choking on this one

print $normal_array["one"]; // should output 1

问候

/R

【问题讨论】:

    标签: php arrays reference pass-by-reference


    【解决方案1】:

    行:

    end($array_of_arrayrefs)["one"] = 1; // 窒息这个

    抛出解析错误:

    解析错误:语法错误,第 65 行 /file.php 中出现意外的“[”

    确保您已激活 error_reportingdisplay_error

    我不确定你想做什么,但这可行:

    $normal_array       = array();
    $array_of_arrayrefs = array( &$normal_array );
    // Here I want to access the $normal_array reference **as a reference**,
    // but that doesn't work obviously. How to do it?
    $array_of_arrayrefs[0]["one"] = 1;
    //end($array_of_arrayrefs )["one"] = 1; // choking on this one
    print $normal_array["one"]; // should output 1
    

    【讨论】:

      【解决方案2】:

      end() 不返回最后一个值的引用,而是返回最后一个值本身。这是一个解决方法:

      $normal_array       = array();
      $array_of_arrayrefs = array( &$normal_array );
      
      $refArray = &end_byref( $array_of_arrayrefs );
      $refArray["one"] = 1;
      
      print $normal_array["one"]; // should output 1
      
      function &end_byref( &$array ) {
          $lastKey = end(array_keys($array));
          end($array);
          return $array[$lastKey];
      }
      

      【讨论】:

        【解决方案3】:

        这里有几种方法,我觉得这两种方法都不是特别令人满意。 我相信有更好的方法..

        <?php
        $normal_array       = array();
        $array_of_arrayrefs = array( "blah", &$normal_array );
        
        foreach ($array_of_arrayrefs as &$v);
        $v["one"] = 1;
        
        echo $normal_array["one"];  //prints 1
        ?>
        
        
        <?php
        $normal_array       = array();
        $array_of_arrayrefs = array( "blah", &$normal_array );
        
        $lastIndex = @end(array_keys($array_of_arrayrefs)); //raises E_STRICT because end() expects referable.
        $array_of_arrayrefs[$lastIndex]["one"] = 1;
        
        echo $normal_array["one"];  //prints 1
        ?>
        

        【讨论】:

          【解决方案4】:

          您可能一开始就不应该通过引用传递。这样做通常被认为是不好的做法,因为它很难看到状态在哪里被修改。

          引用速度更快是一个很常见的误解。事实并非如此——事实上,它们的速度有点慢,但速度太慢了,这并不重要。 PHP 有一个称为 copy-on-write 的系统,这意味着在写入变量之前实际上不会复制变量。

          您真正需要引用的唯一地方是在 PHP4 中,否则对象会被克隆。这在 PHP5 中是不需要的。

          【讨论】:

            【解决方案5】:

            函数 end() 不只是返回一个值。它还移动数组的内部指针。然后我们可以使用 key() 来获取索引,之后我们就可以使用常规的数组访问来进行赋值了。

            $normal_array       = array();
            $array_of_arrayrefs = array( &$normal_array );
            
            end($array_of_arrayrefs);
            $array_of_arrayrefs[ key($array_of_arrayrefs) ]["one"] = 1;
            
            print $normal_array["one"];
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-09-14
              • 1970-01-01
              • 2011-12-12
              • 1970-01-01
              • 2011-10-26
              • 1970-01-01
              • 2014-05-22
              • 1970-01-01
              相关资源
              最近更新 更多