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

在PHP的日常操作中,数组是最常出现的结构,而我们几乎每天都在处理数组相关的内容,这篇文章主要给大家介绍了关于PHP数组迭代器的使用方法,需要的朋友可以参考下

近来在开发一个视力筛查电子报告系统的产品,这个产品的作用是自动提取视力筛查过程中得到的屈光检查数据,并结合数据自动生成通俗易懂且专业的电子报告,以方便家长可以通过公众号或H5链接查阅。

要实现这个需求,第一步是对验光设备里打印出来的纸质报告做OCR,图片识别接口返回的是二维数组,报告的原图是这样的:

OCR接口返回的数据是这样的

  1. array(3) {
  2. ["words_result"]=>
  3. array(36) {
  4. [0]=>
  5. array(1) {
  6. ["words"]=>
  7. string(8) "FA-6000A"
  8. }
  9. [1]=>
  10. array(1) {
  11. ["words"]=>
  12. string(10) "2022-09-16"
  13. }
  14. [2]=>
  15. array(1) {
  16. ["words"]=>
  17. string(7) "04:00"
  18. }
  19. [3]=>
  20. array(1) {
  21. ["words"]=>
  22. string(8) "SHOP:B"
  23. }
  24. [4]=>
  25. array(1) {
  26. ["words"]=>
  27. string(7) "NAME:"
  28. }
  29. [5]=>
  30. array(1) {
  31. ["words"]=>
  32. string(3) "<R>"
  33. }
  34. [6]=>
  35. array(1) {
  36. ["words"]=>
  37. string(1) "C"
  38. }
  39. [7]=>
  40. array(1) {
  41. ["words"]=>
  42. string(1) "A"
  43. }
  44. [8]=>
  45. array(1) {
  46. ["words"]=>
  47. string(5) "-1.50"
  48. }
  49. [9]=>
  50. array(1) {
  51. ["words"]=>
  52. string(5) "-0.25"
  53. }
  54. [10]=>
  55. array(1) {
  56. ["words"]=>
  57. string(3) "131"
  58. }
  59. [11]=>
  60. array(1) {
  61. ["words"]=>
  62. string(5) "-1.50"
  63. }
  64. [12]=>
  65. array(1) {
  66. ["words"]=>
  67. string(7) "-0,25"
  68. }
  69. [13]=>
  70. array(1) {
  71. ["words"]=>
  72. string(3) "122"
  73. }
  74. [14]=>
  75. array(1) {
  76. ["words"]=>
  77. string(7) "-1,50"
  78. }
  79. [15]=>
  80. array(1) {
  81. ["words"]=>
  82. string(7) "-0,25"
  83. }
  84. [16]=>
  85. array(1) {
  86. ["words"]=>
  87. string(3) "114"
  88. }
  89. [17]=>
  90. array(1) {
  91. ["words"]=>
  92. string(5) "-1.50"
  93. }
  94. [18]=>
  95. array(1) {
  96. ["words"]=>
  97. string(7) "-0,25"
  98. }
  99. [19]=>
  100. array(1) {
  101. ["words"]=>
  102. string(3) "122"
  103. }
  104. [20]=>
  105. array(1) {
  106. ["words"]=>
  107. string(3) "<L>"
  108. }
  109. [21]=>
  110. array(1) {
  111. ["words"]=>
  112. string(1) "C"
  113. }
  114. [22]=>
  115. array(1) {
  116. ["words"]=>
  117. string(1) "A"
  118. }
  119. [23]=>
  120. array(1) {
  121. ["words"]=>
  122. string(5) "-1.50"
  123. }
  124. [24]=>
  125. array(1) {
  126. ["words"]=>
  127. string(4) "+0.0"
  128. }
  129. [25]=>
  130. array(1) {
  131. ["words"]=>
  132. string(5) "-1.25"
  133. }
  134. [26]=>
  135. array(1) {
  136. ["words"]=>
  137. string(7) "-0,25"
  138. }
  139. [27]=>
  140. array(1) {
  141. ["words"]=>
  142. string(3) "158"
  143. }
  144. [28]=>
  145. array(1) {
  146. ["words"]=>
  147. string(5) "-1.00"
  148. }
  149. [29]=>
  150. array(1) {
  151. ["words"]=>
  152. string(5) "-0.25"
  153. }
  154. [30]=>
  155. array(1) {
  156. ["words"]=>
  157. string(3) "100"
  158. }
  159. [31]=>
  160. array(1) {
  161. ["words"]=>
  162. string(1) "*"
  163. }
  164. [32]=>
  165. array(1) {
  166. ["words"]=>
  167. string(5) "-1.25"
  168. }
  169. [33]=>
  170. array(1) {
  171. ["words"]=>
  172. string(4) "+0.0"
  173. }
  174. [34]=>
  175. array(1) {
  176. ["words"]=>
  177. string(5) "U0=12"
  178. }
  179. [35]=>
  180. array(1) {
  181. ["words"]=>
  182. string(5) "PD=58"
  183. }
  184. }
  185. ["words_result_num"]=>
  186. int(36)
  187. ["log_id"]=>
  188. int(1455742838110100386)
  189. }

而系统的需求是提取两个号后面的两个数字,那肯定是对上述数组做遍历处理,然后遇到号便提取接下来的两个元素,但在foreach里面,如果做标记,等下次进来时再提取数据比较麻烦,能不能在遇到*号字符串后,直接提取接下来的两个字符串呢,这时我的脑海里出现了迭代器的概念,可能是之前用python或java开发时接触到的吧,于是搜索了一下,果然PHP也是有迭代器的!!!

接下来简单看了一下PHP文档中的示例,就开始干了,很顺利,5分钟完工,下面把代码贴出来并辅以简单的注释帮助大家理解:

  1. $usefulNumList = [];
  2. $wordsResult = new \ArrayIterator($wordsResult);//初始化数组迭代器,传入数组变量
  3. foreach($wordsResult as $item){
  4. $tempWords = $item['words'];
  5. if(strpos($tempWords, '*') !== false){
  6. if($tempWords === '*'){//有时候,*号会单独识别成一个字符串,有时候会和后面的数字识别到一起,如果是单独识别出来的,要把指针向后挪一位
  7. $wordsResult->next();//实现方法是: 数组变更名->next()方法
  8. }
  9. //注意,调用了next()方法后,不能再用$item去取数组元素值,要用current()方法才能取到"下一个值"
  10. array_push($usefulNumList, $this->getCleanNum($wordsResult->current()['words']));
  11. $wordsResult->next();
  12. array_push($usefulNumList, $this->getCleanNum($wordsResult->current()['words']));
  13. }
  14. }

需注意的地方请看一下代码注释,本身封装得很好,很容易理解和调用的。