@@ -174,10 +174,9 @@ public function readEdiDataValueReq($filter, int $l1, $l2 = false)
174174 * @param bool $required if required, but no exist, register error
175175 * @return string|null
176176 */
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 )
178178 {
179- $ segment = false ;
180- $ segment_count = 0 ;
179+ $ found_segments = [];
181180 $ segment_name = $ filter ;
182181 $ filter_elements = false ;
183182 if (\is_array ($ filter )) {
@@ -221,24 +220,23 @@ public function readEdiDataValue($filter, int $l1, $l2 = false, bool $required =
221220 continue ;
222221 }
223222 }
224- $ segment = $ edi_row ;
225- $ segment_count ++;
223+ $ found_segments [] = $ edi_row ;
226224 }
227225 }
228226
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 );
233232 }
233+ } catch (ReaderException $ e ) {
234+ $ this ->errors [] = $ e ->getMessage ();
234235
235236 return null ;
236237 }
237238
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 ) {
242240 return null ;
243241 }
244242
@@ -561,4 +559,45 @@ private static function unwrap($string)
561559 }
562560 }
563561 }
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+ }
564603}
0 commit comments