$data = array('a', 'b', 'c');
foreach ($data as $key => $val) {
$val = &$data[$key];
var_dump($data);
}var_dump($data);输出结果是array(3) {
  [0]=>
  &string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  &string(1) "b"
  [2]=>
  string(1) "c"
}
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  &string(1) "c"
}
array(3) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  &string(1) "c"
}
$val = &$data[$key];这个返回到底是啥意思?
我怎么觉得,我那几个var_dump都应该返回array(a,b,c)

解决方案 »

  1.   

    var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。你可以看看PHP手册里面的介绍很详细
      

  2.   

    LZ,你可以用print_r($data)就知道了,var_dump()的输出方式是不同的,你每次的输出并不是$val,而是$data,每次都是输出的原来的数组;$data = array('a', 'b', 'c');
    foreach ($data as $key => $val) {
    $val = &$data[$key];
    var_dump($data);
    }
      

  3.   

    $key        $val                                         $data
    0           被赋a地址                                     a,b,c
    1           a地址被赋值为b地址($data中的a变成了b)           b,b,c      
    2           b地址被赋值为c地址($data中的b变成了c)           b,c,c
      

  4.   

    $key      ||       $val                              ||   $data
    0         ||     被赋a地址                                ||    a,b,c
    1         ||     a地址被赋值为b地址($data中的a变成了b)  ||    b,b,c   
    2         ||    b地址被赋值为c地址($data中的b变成了c)   ||    b,c,c
      

  5.   

      建议楼上几位看清人家的问题行不,都答非所问。
    $val = &$data[$key];这句话把$data[$key] 和 $val ,第一次执行的时候两者都执行数组data的第一个数据块,里面存放的数据是a;第二次循环的时候首先循环会给val重新赋值为b,结果它所对应的数组的第一个数据块也被改变成了b,接着第二次执行$val = &$data[$key];是对变量val重新指定了内存地址(也就是数组data的第二个数据块),道理就是这样的。不知道楼主明白了不,说的有点乱。 呵呵
      

  6.   

      第一次将数组$data[0]也就是a的地址赋给数组$data第一个值$data[0],此时$data[0]依然是a 因此输出a,b,c
      第二次将数组$data[1]也就是b的地址赋给数组$data第一个值$data[0],此时$data[0]则变为b 因此输出b,b,c
      第二次将数组$data[2]也就是b的地址赋给数组$data第一个值$data[0],此时$data[0]则变为c 因此输出c,b,c(b,b,c)