2

私はいくつかの本の例を読んでいますが、ある例がなぜそのように機能するのか理解できません. この例では、配列が関数に渡されます。関数は、すべての要素を別々の行に含むテーブルを作成します。私の質問は、この関数でリセットがどのように機能するかです。私のロジックでは、リセットが $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 ループの外で 1 回だけ呼び出されます。そのため、create_table への呼び出しごとに 1 回だけ配列をリセットします。次に、ループ内に next($data) があり、ポインターを次の要素に移動します

于 2012-12-10T16:37:40.560 に答える
2

ループを強調表示します。

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

最後の発言見た?next($array)は「ポインタ」を 1 つ前方に移動し、値は に格納され$valueます。配列ポインターが最後に到達すると、next()が戻りfalse、ループも停止します。

のような構造foreach()は、これを暗黙的に行います。つまり、配列をリセットし、その要素をループします。

于 2012-12-10T16:37:35.287 に答える
0

reset()関数に入ったときに配列ポインターを先頭に設定して、反復した配列が先頭から始まるようにします。

ループのnext()内側はwhile実際にポインターを進めます。

于 2012-12-10T16:38:41.073 に答える
0

[このコードは機能する]のはなぜですか?

$dataを使用して、配列 ( ) を反復処理しています。current()next()

フロー:

  • reset()配列を先頭に
  • 要素を取得するcurrent()(最初)
  • whileあなたが持っているループ$value
    • next()要素に移動
于 2012-12-10T16:37:00.260 に答える
0

whileループのnext()この行$value = next($data);には、配列内の次の要素に移動するa があるためです。したがって、ループは と を使用して配列を反復処理しますcurrent()next()

于 2012-12-10T16:37:15.733 に答える
0

next内部配列ポインターを先に移動する ためです。reset内部配列ポインタが先頭にあることを確認するために使用され (つまり、nextこの関数呼び出しの前に何かが呼び出された場合に備えて)、current最初の値を取得します。その後、 で進み続けnextます。

実際には、配列は参照渡しではないため、何もしないと確信してresetいますが、私は肯定的ではありません。

私はこれをまったくお勧めしません。時代遅れだと思います。私は使用しますforeach。上記は、偽の値が正当に配列内にある場合でも機能しません。

于 2012-12-10T16:38:11.287 に答える