ホームページ  >  記事  >  バックエンド開発  >  PHP イテレータ ジェネレータの概要

PHP イテレータ ジェネレータの概要

不言
不言オリジナル
2018-07-05 15:08:271752ブラウズ

この記事では主に PHP イテレータ ジェネレータの紹介を紹介しますが、これは参考になると思います。今回はそれを共有します。必要な友人は参考にしてください。

イテレーションとイテレータ

イテレーションプロセスを繰り返し実行することを指し、各実行はイテレーションと呼ばれます。たとえば、通常の走査は反復です。

$arr = [1, 2, 3, 4, 5];foreach($arr as $key => $value) {    echo $key . ' => ' . $value . "\n";}

foreach が配列を走査し、その内容を繰り返し出力していることがわかります。 foreach 内で、各反復は現在の要素の値を $value に割り当て、配列ポインターを次の要素に移動して次の反復に備えます。これにより、シーケンスのトラバースが実現されます。外部関数が自身の内部データを反復できるようにするインターフェイスは Iterator インターフェイス であり、対応する反復された自己は Iterator オブジェクト です。

PHP は、統一されたイテレータ インターフェイスを提供します。

Iterator extends Traversable {    // 返回当前的元素
    abstract public mixed current(void)
    // 返回当前元素的键
    abstract public scalar key(void)
    // 向下移动到下一个元素
    abstract public void next(void)
    // 返回到迭代器的第一个元素
    abstract public void rewind(void)
    // 检查当前位置是否有效
    abstract public boolean valid(void)}

Iterator インターフェイス を実装することにより、オブジェクトをトラバースする方法を自分で決定できます。

Foreach が機能するのは、これらのコレクション クラスがすべて Iterator の生成メソッドを定義する Iterable インターフェイスを実装しており、foreach が Iterable インターフェイスを通じてシーケンス内を移動するためです。

収量とジェネレーター

イテレーターと比較して、ジェネレーターは、パフォーマンスのオーバーヘッドと複雑さが少なく、単純な オブジェクト反復を実装する簡単な方法を提供します。

ジェネレーター関数は通常の関数のように見えます。違いは、通常の関数が値を返すのに対し、ジェネレーターは yield多くの値を生成でき、それぞれの生成は一時停止するだけであることです。この状態にある場合、次回ジェネレーター関数が呼び出されたときに、PHP は最後に一時停止された状態から実行を継続します。

ジェネレーターを使用すると、生成された値に対応するキー名を連想配列のように指定できます。次のようにキーと値のペアを生成することは、連想配列を定義することと似ています。

function xrange($start, $limit, $step = 1) {    
for ($i = $start, $j = 0; $i <= $limit; $i += $step, $j++) {        // 给予键值
        yield $j => $i;
    }
}$xrange = xrange(1, 10, 2);foreach ($xrange as $key => $value) {    
echo $key . &#39; => &#39; . $value . "\n";}

概念の理解

最初に概念を明確にします: ジェネレーターの yield キーワードは戻り値ではなく、専門用語では出力値と呼ばれ、値を生成するだけです。実際、ジェネレーター関数は Generator オブジェクトを返しますが、これは new を通じてインスタンス化できず、Iterator インターフェイスを実装します。

では、コード foreach のループは何でしょうか? PHP がジェネレーターを使用すると、クラス Generator のオブジェクトが返されます。 foreach オブジェクトは反復可能です。反復ごとに、PHP は Generator インスタンスを通じて次に反復する必要がある値を計算します。このようにして、foreach は次に反復する必要がある値を知ることができます。

また、動作中は、for はループ実行直後に停止します。次のループ中に foreachfor に次の値を再度要求するまで待機し、ループが再度実行されます。そしてすぐに再び停止します。条件が満たされない限り実行されません。

#ジェネレーターの利点

  • ジェネレーターは、PHP アプリケーションのパフォーマンスに大きな影響を与えます

  • PHP コードは実行時に多くのメモリを節約します

  • 大量のデータの計算に適しています

実際の開発アプリケーション: 非常に大きなファイルの読み取り

PHP 開発では、csv ファイル、テキスト ファイル、一部のログ ファイルなどの大きなファイルの読み取りが必要になることがよくあります。これらのファイルが 5G など大きい場合。現時点では、すべての内容を一度にメモリに直接読み取ることは現実的ではありません。ジェネレーターを使用してファイルを読み取ります。最初の行は初めて読み取られ、2 行目は 2 回目に読み取られます。

毎回メモリにロードされるテキストは 1 行だけです、メモリ使用量が大幅に削減されます。

<?php
header("content-type:text/html;charset=utf-8");
function readTxt()
{
    # code...
    $handle = fopen("./test.txt", &#39;rb&#39;);

    while (feof($handle)===false) {
        # code...
        yield fgets($handle);
    }

    fclose($handle);
}

foreach (readTxt() as $key => $value) {
    # code...
    echo $value.&#39;<br />&#39;;
}

以上がこの記事の全内容です。皆様の学習にお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP は Azure Storage Blob を使用してファイルをアップロードします

PHP で他のインターフェイスをリクエストする Curl の概要インターフェース# ########

以上がPHP イテレータ ジェネレータの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。