加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

有关PHP数组迭代器的使用方法实例

发布时间:2022-06-29 14:09:35 所属栏目:PHP教程 来源:互联网
导读:在PHP的日常操作中,数组是最常出现的结构,而我们几乎每天都在处理数组相关的内容,这篇文章主要给大家介绍了关于PHP数组迭代器的使用方法,需要的朋友可以参考下 近来在开发一个视力筛查电子报告系统的产品,这个产品的作用是自动提取视力筛查过程中得到的屈光
  在PHP的日常操作中,数组是最常出现的结构,而我们几乎每天都在处理数组相关的内容,这篇文章主要给大家介绍了关于PHP数组迭代器的使用方法,需要的朋友可以参考下
 
  近来在开发一个视力筛查电子报告系统的产品,这个产品的作用是自动提取视力筛查过程中得到的屈光检查数据,并结合数据自动生成通俗易懂且专业的电子报告,以方便家长可以通过公众号或H5链接查阅。
 
  要实现这个需求,第一步是对验光设备里打印出来的纸质报告做OCR,图片识别接口返回的是二维数组,报告的原图是这样的:
 
  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)
  }
  而系统的需求是提取两个号后面的两个数字,那肯定是对上述数组做遍历处理,然后遇到号便提取接下来的两个元素,但在foreach里面,如果做标记,等下次进来时再提取数据比较麻烦,能不能在遇到*号字符串后,直接提取接下来的两个字符串呢,这时我的脑海里出现了迭代器的概念,可能是之前用python或java开发时接触到的吧,于是搜索了一下,果然PHP也是有迭代器的!!!
 
  接下来简单看了一下PHP文档中的示例,就开始干了,很顺利,5分钟完工,下面把代码贴出来并辅以简单的注释帮助大家理解:
 
  $usefulNumList = [];
  $wordsResult = new ArrayIterator($wordsResult);//初始化数组迭代器,传入数组变量
  foreach($wordsResult as $item){
      $tempWords = $item['words'];
      if(strpos($tempWords, '*') !== false){
          if($tempWords === '*'){//有时候,*号会单独识别成一个字符串,有时候会和后面的数字识别到一起,如果是单独识别出来的,要把指针向后挪一位
              $wordsResult->next();//实现方法是: 数组变更名->next()方法
          }
         //注意,调用了next()方法后,不能再用$item去取数组元素值,要用current()方法才能取到"下一个值"
         array_push($usefulNumList, $this->getCleanNum($wordsResult->current()['words']));
         $wordsResult->next();
         array_push($usefulNumList, $this->getCleanNum($wordsResult->current()['words']));
      }
  }
  需注意的地方请看一下代码注释,本身封装得很好,很容易理解和调用的。
 
 

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读