@@ -174,10 +174,9 @@ public function readEdiDataValueReq($filter, int $l1, $l2 = false)
174
174
* @param bool $required if required, but no exist, register error
175
175
* @return string|null
176
176
*/
177
- public function readEdiDataValue ($ filter , int $ l1 , $ l2 = false , bool $ required = false )
177
+ public function readEdiDataValue ($ filter , int $ l1 , $ l2 = false , bool $ required = false , int $ offset = null )
178
178
{
179
- $ segment = false ;
180
- $ segment_count = 0 ;
179
+ $ found_segments = [];
181
180
$ segment_name = $ filter ;
182
181
$ filter_elements = false ;
183
182
if (\is_array ($ filter )) {
@@ -221,24 +220,23 @@ public function readEdiDataValue($filter, int $l1, $l2 = false, bool $required =
221
220
continue ;
222
221
}
223
222
}
224
- $ segment = $ edi_row ;
225
- $ segment_count ++;
223
+ $ found_segments [] = $ edi_row ;
226
224
}
227
225
}
228
226
229
- // no segment found
230
- if (! $ segment ) {
231
- if ($ required ) {
232
- $ this ->errors [] = 'Segment " ' .$ segment_name .'" no exist ' ;
227
+ try {
228
+ if ($ offset !== null ) {
229
+ $ segment = $ this ->getOffsetSegmentFromResult ($ found_segments , $ offset , $ required , $ segment_name );
230
+ } else {
231
+ $ segment = $ this ->getSegmentFromResult ($ found_segments , $ required , $ segment_name );
233
232
}
233
+ } catch (ReaderException $ e ) {
234
+ $ this ->errors [] = $ e ->getMessage ();
234
235
235
236
return null ;
236
237
}
237
238
238
- // found more than one segment - error
239
- if ($ segment_count > 1 ) {
240
- $ this ->errors [] = 'Segment " ' .$ segment_name .'" is ambiguous ' ;
241
-
239
+ if ($ segment === false ) {
242
240
return null ;
243
241
}
244
242
@@ -561,4 +559,45 @@ private static function unwrap($string)
561
559
}
562
560
}
563
561
}
562
+
563
+ /**
564
+ * @param array $matchingSegments
565
+ * @param int $offset
566
+ * @param bool $required
567
+ * @param mixed $segment_name
568
+ *
569
+ * @return false|mixed
570
+ */
571
+ private function getOffsetSegmentFromResult (array $ matchingSegments , int $ offset , bool $ required , mixed $ segment_name ): mixed
572
+ {
573
+ if (isset ($ matchingSegments [$ offset ])) {
574
+ return $ matchingSegments [$ offset ];
575
+ }
576
+
577
+ if ($ required ) {
578
+ throw new ReaderException ('Segment " ' . $ segment_name . '" does not exist at offset " ' . $ offset . '" ' );
579
+ }
580
+
581
+ return false ;
582
+ }
583
+
584
+ /**
585
+ * @param array $matchingSegments
586
+ * @param mixed $segment_name
587
+ *
588
+ * @return false|mixed
589
+ */
590
+ private function getSegmentFromResult (array $ matchingSegments , bool $ required , mixed $ segment_name ): mixed
591
+ {
592
+ // found more than one segment - error
593
+ if (count ($ matchingSegments ) > 1 ) {
594
+ throw new ReaderException ('Segment " ' . $ segment_name . '" is ambiguous ' );
595
+ }
596
+
597
+ if ($ required && !isset ($ matchingSegments [0 ])) {
598
+ throw new ReaderException ('Segment " ' . $ segment_name . '" no exist ' );
599
+ }
600
+
601
+ return $ matchingSegments [0 ] ?? false ;
602
+ }
564
603
}
0 commit comments