2016-08-06 5 views
2

Ich habe eine Zeichenfolge:Teilen String in associtive Array

$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.'; 

Ich mag würde diese Zeichenfolge in ein assoziatives Array spalten.

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

usw.

schaffte ich es in ein Array zu erhalten mit:

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

Es gibt mir ein Array, aber ich brauche die Schlüssel 'a)', 'b)' usw.

Kann zu sein jemand mir dabei helfen?

+0

Es wäre besser, einen Schritt zurück einen Blick darauf zu werfen, wie Sie diese Zeichenfolge erstellt, das wäre vielleicht ein besserer Ort sein, um eine Änderung – RiggsFolly

Antwort

2

Die Lösung preg_match_all Funktion mit spezifischen regexp Muster verwendet (genannt Masken) und array_combine Funktion (mit einem entsprechenden Schlüssel/Wert-Paare haben):

$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); 

Der Ausgang:

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. 
) 
+0

Ihr Weg eindeutig das ist zu machen Beste. Beachten Sie, dass Sie die Option 'PREG_SET_ORDER' entfernen und das Ergebnis ohne' foreach' erstellen können, wie folgt: '$ result = array_combine ($ matches ['k'], $ matches ['v']);' –

+0

@CasimiretHippolyte Danke für den nützlichen Hinweis. Ich habe die Antwort vereinfacht – RomanPerekhrest

0

Phantasievoller als effizient, aber es macht den 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); 
1

Eine weitere doof Lösung für das doof Format, denn warum nicht.

$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); 

Drucke:

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.)