1. ホーム
  2. Web プログラミング
  3. PHP プログラミング
  4. phpのヒント

PHP の配列イテレータの使用例

2022-01-14 03:41:03

本製品の目的は、視力検査の過程で屈折データを自動的に抽出し、そのデータを組み合わせて、保護者が公共のウェブサイトやH5リンクからアクセスできる、わかりやすく専門的な電子報告書を自動的に作成することです。

この要求を実現するために、まず検眼装置からプリントアウトされた紙の報告書にOCRをかけることにしました。画像認識インターフェースは2次元の配列を返し、レポートのオリジナル画像は次のようになります。

OCR インターフェースから返されるデータは、次のようになります。

array(3) {
  ["words_result"]=>
  array(36) {
    [0]=>
    array(1) {
      ["words"]=>
      string(8) "FA-6000A"
    }
    [1]=>
    array(1) {
      ["words"]=>
      string(10) "2022-09-16"
    }
    [2]=>
    array(1) {
      ["words"]=>
      string(7) "04:00"
    }
    [3]=>
    array(1) {
      ["words"]=>
      string(8) "SHOP:B"
    }
    [4]=>
    array(1) {
      ["words"]=>
      string(7) "NAME:"
    }
    [5]=>
    array(1) {
      ["words"]=>
      string(3) "<R>"
    }
    [6]=>
    array(1) {
      ["words"]=>
      string(1) "C"
    }
    [7]=>
    array(1) {
      ["words"]=>
      string(1) "A"
    }
    [8]=>
    array(1) {
      ["words"]=>
      string(5) "-1.50"
    }
    [9]=>
    array(1) {
      ["words"]=>
      string(5) "-0.25"
    }
    [10]=>
    array(1) {
      ["words"]=>
      string(3) "131"
    }
    [11]=>
    array(1) {
      ["words"]=>
      string(5) "-1.50"
    }
    [12]=>
    array(1) {
      ["words"]=>
      string(7) "-0, 25"
    }
    [13]=>
    array(1) {
      ["words"]=>
      string(3) "122"
    }
    [14]=>
    array(1) {
      ["words"]=>
      string(7) "-1, 50"
    }
    [15]=>
    array(1) {
      ["words"]=>
      string(7) "-0, 25"
    }
    [16]=>
    array(1) {
      ["words"]=>
      string(3) "114"
    }
    [17]=>
    array(1) {
      ["words"]=>
      string(5) "-1.50"
    }
    [18]=>
    array(1) {
      ["words"]=>
      string(7) "-0, 25"
    }
    [19]=>
    array(1) {
      ["words"]=>
      string(3) "122"
    }
    [20]=>
    array(1) {
      ["words"]=>
      string(3) "<L>"
    }
    [21]=>
    array(1) {
      ["words"]=>
      string(1) "C"
    }
    [22]=>
    array(1) {
      ["words"]=>
      string(1) "A"
    }
    [23]=>
    array(1) {
      ["words"]=>
      string(5) "-1.50"
    }
    [24]=>
    array(1) {
      ["words"]=>
      string(4) "+0.0"
    }
    [25]=>
    array(1) {
      ["words"]=>
      string(5) "-1.25"
    }
    [26]=>
    array(1) {
      ["words"]=>
      string(7) "-0, 25"
    }
    [27]=>
    array(1) {
      ["words"]=>
      string(3) "158"
    }
    [28]=>
    array(1) {
      ["words"]=>
      string(5) "-1.00"
    }
    [29]=>
    array(1) {
      ["words"]=>
      string(5) "-0.25"
    }
    [30]=>
    array(1) {
      ["words"]=>
      string(3) "100"
    }
    [31]=>
    array(1) {
      ["words"]=>
      string(1) "*"
    }
    [32]=>
    array(1) {
      ["words"]=>
      string(5) "-1.25"
    }
    [33]=>
    array(1) {
      ["words"]=>
      string(4) "+0.0"
    }
    [34]=>
    array(1) {
      ["words"]=>
      string(5) "U0=12"
    }
    [35]=>
    array(1) {
      ["words"]=>
      string(5) "PD=58"
    }
  }
  ["words_result_num"]=>
  int(36)
  ["log_id"]=>
  int(1455742838110100386)
}


そして、システムは2つの数字の後に2つの数字を抽出する必要があり、それは確かに反復処理を行うために、上記の配列であり、その後、番号が次の2つの要素を抽出しますが、内部foreachで、あなたがマークを行う場合など、次の時間は、データよりトラブルを抽出しに来ています。出会い*番号の文字列にすることはできませんが、直接それを次の2つの文字列を抽出し、この時間は私の心はイテレータの概念が登場これはイテレータの概念が私の心に来たとき、おそらく以前の接触からパイソンやJavaの開発、私はそれを検索し、確かにPHPもイテレータを持っています!私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、私はそれを見て、あなたはそれを見ることができます。

次に、PHPのドキュメントにある例を簡単に見てから、やり始めると、非常にスムーズに、5分で完成、以下のコードを掲載し、分かりやすいように簡単なコメントを補足しています。

$usefulNumList = [];
$wordsResult = new \ArrayIterator($wordsResult);//initialize the array iterator, passing in the array variables
foreach($wordsResult as $item){
	$tempWords = $item['words'];
    if(strpos($tempWords, '*') ! == false){
	    if($tempWords === '*'){/sometimes, the * sign will be identified as a separate string, sometimes it will be identified with the number after it, if it is identified separately, move the pointer back one position
        	$wordsResult->next();//Implementation method is: array change name->next() method
        }
       //Note that after calling the next() method, you can no longer use $item to get the array element values, you have to use the current() method to get the "next value"
       array_push($usefulNumList, $this->getCleanNum($wordsResult->current()['words'])));
       $wordsResult->next();
       array_push($usefulNumList, $this->getCleanNum($wordsResult->current()['words'])));
    }
}


コードコメントをご覧ください。非常によくまとまっていて、理解しやすく、呼び出しも簡単です

概要

PHPの配列イテレータの使い方についての記事です。PHPの配列イテレータの使い方については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続き閲覧してください。