2

I have a string:

$string = 'A0695/16 NOTAMN Q) EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 A) EHAA B) 1605260001 C) 1608260900 EST E) REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.';

I would like to split this string into an associative array.

$result['Q)'] = 'EHAA/QARLT/I /NBO/E /000/999/5155N00430E073';
$result['A)'] = 'EHAA';
$result['B)'] = '1605260001';
$result['C)'] = '1608260900 EST';

etc.

I managed to get it into an array with:

$result = preg_split("/.\)/", $string);

It gives me an array but I need the keys to be 'a)', 'b)' etc.

Can anyone help me with this?

Script47
  • 14,230
  • 4
  • 45
  • 66
  • It might be better to take a step back an look at how you created that string, maybe that would be a better place to make a change – RiggsFolly Aug 06 '16 at 15:15

3 Answers3

2

The solution using preg_match_all function with specific regexp pattern(named submasks) and array_combine function(to get a respective key/value pairs):

$string = 'A0695/16 NOTAMN Q) EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 A) EHAA B) 1605260001 C) 1608260900 EST E) REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.';

preg_match_all("/(?<k>[A-Z]\)) (?<v>.+?)(?= [A-Z]\)|$)/", $string, $matches);

// 'k'/'v' are key/value
$result = array_combine($matches['k'], $matches['v']);

print_r($result);

The output:

Array
(
    [Q)] => EHAA/QARLT/I /NBO/E /000/999/5155N00430E073
    [A)] => EHAA
    [B)] => 1605260001
    [C)] => 1608260900 EST
    [E)] => REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.
)
RomanPerekhrest
  • 88,541
  • 4
  • 65
  • 105
1

Another goofy solution for the goofy format, because why not.

  $string = 'A0695/16 NOTAMN Q) EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 A) EHAA B) 1605260001 C) 1608260900 EST E) REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE.';

  $foo = preg_split('/([A-Z]\)) /', $string, 0, PREG_SPLIT_DELIM_CAPTURE);
  $ret = [];
  foreach (range(1, count($foo) - 1, 2) as $i)
  {
    $ret[$foo[$i]] = $foo[$i + 1];
  }
  print_r($ret);

Prints:

Array (
    [Q)] => EHAA/QARLT/I /NBO/E /000/999/5155N00430E073 
    [A)] => EHAA 
    [B)] => 1605260001 
    [C)] => 1608260900 EST 
    [E)] => REF AIP NETHERLANDS ENR 3.2 UT601 ADD TO ROUTE REMARKS: NOT AVBL FOR TRAFFIC DEP/ARR ETNG, EDDK AND ETNN DURING THE OPENING OF EHEH 0600-2300 (0500-2200). THESE FLIGHTS WILL HAVE TO REROUTE. )
alzee
  • 1,393
  • 1
  • 10
  • 21
0

More fanciful than efficient but it does the job:

$p = preg_split('~(?<!\S)([A-Z]\))\s+~', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
$result = [];
if (count($p) > 1) {
    unset($p[0]);
    while($p) { 
        $result[array_shift($p)] = array_shift($p);
    }
}

print_r($result);
Casimir et Hippolyte
  • 88,009
  • 5
  • 94
  • 125