代码之家  ›  专栏  ›  技术社区  ›  sharkin

如何在PHP的数组中使用数组引用?

  •  3
  • sharkin  · 技术社区  · 16 年前

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

    $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

    5 回复  |  直到 11 年前
        1
  •  4
  •   Andrew Moore    16 年前

    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];
    }
    
        2
  •  1
  •   rewbs    16 年前

    这里有几种方法,我都不觉得特别令人满意。 我肯定有更好的办法。。

    <?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
    ?>
    
        3
  •  1
  •   troelskn    16 年前

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

    这是一个非常常见的误解,即引用更快。事实并非如此——事实上,它们有点慢,但速度很小,真的没关系。PHP有一个名为写时复制的系统,这意味着在写入变量之前,变量实际上并没有被复制。

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

        4
  •  0
  •   Preston    16 年前

    函数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"];
    
        5
  •  -1
  •   A J    9 年前

    线路:

    end($array_of_arrairefs)[“one”]=1;//被这个呛到了

    抛出解析错误:

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

    确保你有 error_reporting display_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