【问题标题】:Does the PHP current() function return a copy or reference of array?PHP current() 函数是否返回数组的副本或引用?
【发布时间】:2011-12-29 21:48:55
【问题描述】:

我创建了一个简单的测试用例来复制我遇到的问题。

我正在使用next()current() 函数遍历一个二维数组,并希望将数组指针设置为特定位置。因此,给定一个变量名为$food 的二维数组,数组结构如下:

array
  0 => <-- POINTER LOCATION
    array
      0 => string 'apple' <-- POINTER LOCATION
      1 => string 'orange'
  1 => 
    array
      0 => string 'onion'
      1 => string 'carrot'

...以及下面的代码sn -p:

// move the inner array's pointer once
$should_be_orange = next(current($food));

// now check that inner array's value
$should_still_be_orange = current(current($food));

...为什么$should_be_orange"orange"的值是$should_still_be_orange"apple"的值?这是因为current() 函数返回内部数组的副本,谁的指针被迭代,然后被销毁(保持原始 数组不变)?还是我只是做错了我没有注意到的事情?

在问题的根源上,如果您不知道外部数组的键(并且必须使用current() 函数来获取外部数组的指针位置),您如何移动内部数组的指针?

【问题讨论】:

    标签: php arrays pointers multidimensional-array


    【解决方案1】:

    不能在参数中传递函数,你只能是变量,因为参数是引用:

    function current(&$array) {...}
    function next(&$array) {...}
    

    所以正确的语法是:

    // move the inner array's pointer once
    $tmp = current($food);
    $should_be_orange = next($tmp);
    
    // now check that inner array's value
    $tmp = current($food);
    $should_still_be_orange = current($tmp);
                     ^^^^^^ NO! It should be "apple" ! When you do next($tmp) it will be orange !
    

    演示:http://codepad.viper-7.com/YZfEAw

    文档:


    当你学习 PHP 时,你应该使用命令显示所有错误:

    error_reporting(E_ALL);
    

    使用这个你应该会收到通知:

    Strict Standards: Only variables should be passed by reference in (...) on line (...)
    

    (我认为这个答案需要复习英语语法的原因)

    【讨论】:

    • 文档与当前实现不同步。您应该将变量传递给next()current(),但表达式/数组常量也可以。
    • 是的,它会起作用,但它会产生如上所述的严格标准错误。传递函数而不是变量是这里的主要问题。
    • 你在哪个版本中测试过?因为它对我来说既不是 PHP 5.3 也不是 5.4。 -- 不,主要问题是没有参考返回,正如 OP 已经怀疑的那样。
    • 是的!所有信息都在文档中。
    【解决方案2】:

    其实current()从数组中返回一个元素。在您的情况下,此元素也是一个数组,这就是为什么 next() 在您的代码中完全起作用的原因。您的next() 不适用于$food 数组,而是$food[0] 的副本,由current() 返回

    【讨论】:

    • 好吧,正是我所怀疑的。假设我总是有一个二维数组(如示例),您对如何移动内部数组的指针有什么建议吗?
    猜你喜欢
    • 2019-09-06
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2015-03-10
    • 2020-10-11
    相关资源
    最近更新 更多