String in Array aufsplitten

mmueller-87

Mitglied
Hallo,

ich habe ein kleines Denkproblem. Ich bin gerade dabei, einen String der verschiedene Segmente enthält, in einem Array zu bringen. Leider habe ich keine Ahnung wie man das am besten umsetzen kann.

Mein String:
Code:
userid : uniqueid : name
------ : ---------: ----
    10 : 98765456789 : Max Weber
    11 : 98756789989 : Ben Karl
2 users

Diesen bekomme ich anhand einer Schnittstelle. Nun wäre mein Anliegen so:
Code:
Array
(
    [0] => array
      (
        [userid] => 10,
        [uniqueid] => 98765456789,
        [name] => 'Max Weber',
      ),
    [1] => array
      (
        [userid] => 11,
        [uniqueid] => 98756789989,
        [name] => 'Ben Karl',
      ),
)

Wie bekomme ich das hin?
 
Zuletzt bearbeitet:
Einfach ein bischen die Arrayfunktionen verknüpfen

PHP:
//Testdaten
$text = <<<TXT
userid : uniqueid : name
------ : ---------: ----
    10 : 98765456789 : Max Weber    
    11 : 98756789989 : Ben Karl
2 users
TXT;

// Zeilenumbrüche korrigieren
$text = str_replace("\r\n", "\n", $text); # windows -> linux
$text = str_replace("\r", "\n", $text); # mac -> linux

//Die Zeilen in einen Array werfen
$lines = explode("\n", $text);

/**
 * Die Zeilen bis hierhin können gestrichen werden wen der Text in einer Date liegt.
 * Einfach mit $lines = file('myFilePath'); auslesen 
 */

//Leere Zeilen und Zeilen mit nur Leerzeichen drin entfernen
$lines = array_filter($lines, 'trim');

//Die erste Zeile zerlegen und als Schlüssel merken
$keys = explode(":", array_shift($lines));
//Umgebende Leerzeichen entfernen
$keys = array_map('trim', $keys);

//Die Zeile ------ : ---------: ---- ins Nirvana schicken
array_shift($lines);
//Dasselbe mit der Totalzeile
array_pop($lines);

//die Restlichen Zeilen durchgehen
$out = array();
foreach($lines as $line){
    //Zeile zerlegen
    $values = explode(":", $line);
    //umgebende Leerzeichen entfernen
    $values = array_map('trim', $values);
    //Und mit dem Key-Array kombinieren und zum Ausgabearray hinzufügen
    $out[] = array_combine($keys, $values);
}

print_r($out);
 
Hallo,

vielen Dank. Leider ist mir ein Fehler unterlaufen. Der String:
Code:
userid : uniqueid : name
------ : ---------: ----
    10 : 98765456789 : Max Weber
    11 : 98756789989 : Ben Karl
2 users

ist unformatiert. Sprich der String würde so aussehen:

Code:
userid : uniqueid : name ------ : ---------: ---- 10 : 98765456789 : Max Weber 11 : 98756789989 : Ben Karl 2 users
 
Kein Trennzeichen? Kein Anhaltspunkt ob das Leerzeichen zum Text oder als Zeilentrenner dient?
Dann hast dus echt schwer.

Code:
... 10 : 98765456789 : Max Weber 11 : 98756789989 :  Ben Karl 2  ...
//Ist das jetzt
10 : 98765456789 : Max
Weber 11 : 98756789989 :  Ben
...

Höchstesn ev. mit Regulären AUsdrücken. Aber mal ganz ehrlich. Welcher Feeder liefert ein so uinbrauchbares Format? Ich habe schon viele beschissene Feederformate gesehen, aber das ist echt die Krönung.

Sind immerhin die Überschriften immer gleich?
Und immer eine ID (also eine Zahl), gefolgt von einer Zahl gefolgt von einem String?
 
Naja, nach " : " exploden würde ja erstmal reichen. Und dann die entsprechenden Teile aus dem entsteheneden array wählen.
 
Nö. Dann hat er das letzte Feld und das erste der folgenden Zeile zusammen
"Max Weber 11"
 
Hallo, habe eine andere Schnittstelle, die mir mehr infos gibt. Kann mir einer das evtl. an das obrige Script anpassen?

Code:
hostname:  Web4f.de [ Countersrike 1.6 - Fun Server ]
         version :  48/1.1.2.7/Stdio 5787 secure  (10)
         tcp/ip  :  178.254.6.180:27015
         map     :  fy_buzzkill at: 0 x, 0 y, 0 z
         players :  1 active (16 max)
         
         #      name userid uniqueid frag time ping loss adr
         # 1 "GuyPrayer" 2 STEAM_0:0:64036919   0 00:22   61   35 91.66.225.231:27005
         1 users
 
Zuletzt bearbeitet:
1) mittel file() die Zeilen in einen Array schmeissen
2) Mittels Trim bei jeder Zeile die führenden Leerzeichen entfernen.
3) Prüfen ob die getrimmte Zeile mit einem # beginnt
4) Die erste so gefundene Zeile ist die Titelzeile
5) Die restlichen Zeilen mittels str_getcsv() parsen

Dank den Zusätzlichen SInnlosen Leerzeichen zweischendrin wirds aber nicht viel einfacher

PHP:
$lines = file('myFilePath'); 
 
//Alle Zeilen trimmen
$lines = array_map('trim', $lines);

//Nur die Zeilen die mit # beginnen ausfiltern
$lines = array_filter($lines, create_function('$line', 'return substr($line, 0, 1) == "#";'));

//Die erste Zeile zerlegen und als Schlüssel merken
$keys = str_getcsv(array_shift($lines), ' ');
//Die Leereinträge wegen weiderholenden Leerzeichen entfernen
$keys = array_filter($keys);

//die Restlichen Zeilen durchgehen
$out = array();
foreach($lines as $line){
    //Zeile zerlegen
    $values =  str_getcsv(array_shift($lines), ' ', '"');
    //Die Leereinträge wegen weiderholenden Leerzeichen entfernen
    $values = array_filter($values);
    //Und mit dem Key-Array kombinieren und zum Ausgabearray hinzufügen
    $comb = array_combine($keys, $values);
    //Den Eintrag #=># entfernen
    array_shift($comb);
    
    $out[] = $comb;
}

So gehts natürlich nur wenn die Anzahl Titel mit der Anzahl Einträge übereinstimmt
 
Hallo,

vielen Dank für deine Mühe. Funktioniert auch. Nun wäre aber noch zu klären, ich bekomme diese Aussage von einer API, sprich hole diese über fsockopen(). Da macht es keinen Sinn wenn diese in einer Datei gespeichert werden, wenn zuviele Anfragen kommen. Flatfile, zuviele Anfragen, wir kennen das =)

Ich bekomme diese Ausgabe:
Code:
Array
(
    [0] => Array
        (
            [name] => 1
            [userid] => GuyPrayer
            [uniqueid] => 2
            [frag] => STEAM_0:0:64036919
            [time] => 00:22
            [ping] => 61
            [loss] => 35
            [adr] => 91.66.225.231:27005
        )

)

So ist es auch richtig, nur wie kann ich anstatt der Id vom Array (0) den Spielernamen darin speichern? Zb so wollte ich das haben:

Code:
Array
(
    [GuyPrayer] => Array
        (
            [name] => 1
            [userid] => GuyPrayer
            [uniqueid] => 2
            [frag] => STEAM_0:0:64036919
            [time] => 00:22
            [ping] => 61
            [loss] => 35
            [adr] => 91.66.225.231:27005
        )

)

Bei deinem ersten Beispiel laß er das von einem String, wie geht das hier?
 
Zuletzt bearbeitet:
Zurück