2

我正在浏览一些书籍示例,但无法理解为什么一个示例会以这种方式工作。在这个例子中,一个数组被传递给一个函数。然后该函数创建一个表格,其中包含单独行上的所有元素。我的问题是重置如何在此功能中工作?在我的逻辑中,当 reset 重置 $data 时,数组返回到第一个元素,并且表格应该无休止地只显示第一个元素。只是在浏览器中看到结果,我知道这不是真的。但为什么?

<?php

    function create_table($data) {
        echo "<table border=\"1\">";
        reset($data); // Remember this is used to point to the beginning 
        $value = current($data);
        while ($value) {
            echo "<tr><td>".$value."</td></tr>\n";
            $value = next($data);
        }
        echo "</table>";
    }
?>

<?php
    $my_array = array('Line one. ','Line two. ','Line three. ');
    create_table($my_array);
?>
4

7 回答 7

3

数组有一个指示当前元素位置的内部指针。该current()函数获取当前项,然后next()移动到下一项并获取它。该reset()函数将指针移回起点。

最终这是对函数调用的浪费。只需使用foreach($data as $value)就足够了,但还有一种更简单的方法:

function create_table($data) {
  echo "<table border=\"1\"><tr><td>".implode("</td></tr><tr><td>",$data)."</td></tr></table>";
}
于 2012-12-10T16:36:59.290 回答
3

重置仅在 while 循环之外调用一次。因此,每次调用 create_table 时它只会重置一次数组。然后,在循环中,有 next($data) 将指针移动到下一个元素

于 2012-12-10T16:37:40.560 回答
2

我将突出显示循环:

while ($value) {
        echo "<tr><td>".$value."</td></tr>\n";
        $value = next($data);
    }

你看到最后的声明了吗?next($array)将“指针”向前移动一位,值存储在$value. 当数组指针到达末尾时,next()将返回false并且也将停止循环。

类似的构造foreach()隐式地执行此操作,即它重置数组并循环遍历其元素。

于 2012-12-10T16:37:35.287 回答
0

为什么[此代码有效]?

您正在使用and遍历数组 ( $data) 。current()next()

流动:

  • reset()数组到开头
  • 获取current()元素(第一)
  • 循环while你有一个$value
    • 移动到next()元素
于 2012-12-10T16:37:00.260 回答
0

因为while循环next()在这一行中有一个,$value = next($data);它转到数组中的下一个元素。current()因此,循环使用和遍历数组next()

于 2012-12-10T16:37:15.733 回答
0

因为next将内部数组指针向前移动。 reset用于确保内部数组指针位于开头(即以防万一next或类似的东西在此函数调用之前对其进行调用),并current获取第一个值。然后,它继续向前推进next

实际上,由于数组不是通过引用传递的,我很确定reset它什么都不做,但我并不肯定。

我根本不会推荐这个,而且我认为它有点过时了。我会用foreach. 如果虚假值合法地位于数组内部,则上述内容甚至都不起作用。

于 2012-12-10T16:38:11.287 回答
0

reset()在进入函数时将数组指针设置为开头,以确保它在数组迭代时从开头开始。

循环内部实际上next()使while指针前进。

于 2012-12-10T16:38:41.073 回答