gechger
Goto Top

explode Funktion nutzen aus einem bestehenden Array

Ich habe mich mit dem Explode beschäftigt, komme aber nun nicht weiter

Hallo Forum,

ich habe ein kleines Script welches mir einiges an Daten aus einer MYSQL Datenbank in ein Array schreibt. Diese Daten sehen jetzt so aus:

2008-10-10_07:42:03 table=BB bTYP=10100 bLOG=1567 bDAT=2008-10-10_07:39:45 bIMP= bFLAG=0 bGPS=B,,,,,, bTER=5555 bPER=
blog=: bLOG=1567, terminalnummer=: bTER=5555 , Personalnummer=: bPER= 2008-10-10_07:42:03 table=BB bTYP=10100 bLOG=1567 bDAT=2008-10-10_07:39:45 bIMP= bFLAG=0 bGPS=B,,,,,, bTER=5555 bPER=
2008-10-10_07:42:04 table=BB bTYP=10111 bLOG=1567 bDAT=2008-10-10_07:39:51 bIMP= bFLAG=0 bGPS=V,5236.2929,N,01002.9705,E, bTER=5555 bPER=
2008-10-10_07:42:06 table=BB bTYP=10101 bLOG=1567 bDAT=2008-10-10_07:39:57 bIMP=1 bFLAG=0 bGPS=V,5236.2929,N,01002.9705,E, bTER=5555 bPER=
2008-10-10_07:42:07 table=BB bTYP=10105 bLOG=1567 bDAT=2008-10-10_07:40:15 bIMP=648 bFLAG=0 bGPS=V,5236.2929,N,01002.9705,E, bTER=5555 bPER=
2008-10-10_07:42:12 table=BB bTYP=10105 bLOG=1567 bDAT=2008-10-10_07:40:45 bIMP=1565 bFLAG=0 bGPS=V,5236.2929,N,01002.9705,E, bTER=5555 bPER=

je nach Abfragezeitraum können in dem Array bis zu 5000 Datensätze stehen. Die einzelnen Informationen stehen mit TAB getrennt hintereinander in einer Spalte "Werte".
Mein Ziel ist es, im ersten Schritt alle nicht benötigten Informationen raus zu schmeissen. Mich interessiert nur die Information "bLOG=XXXX" , "bTER=XXXX" und "bPER=XXXX". Alles andere will ich nicht sehen.
Im zweiten Schritt will ich alle doppelten Werte eliminieren. Zum Schluß soll eine Liste erscheinen, die in etwa so aussieht:
bLOG=1234, bTER=5678, bPER=000123456789
bLOG=1234, bTER=5678, bPER=0009654786
bLOG=6363, bTER=2233, bPER=00012358912
usw.


$sql1 = ("SELECT * FROM $tabelle1 where datum > '$datumvon' and datum < '$datumbis' ");

Ausgabe der abgefragten Informationen...
$abfrage=mysql_Query ($sql1);
...und Ausgabe in ein Array
$row1 = mysql_fetch_row($abfrage);

$idintern = "$row1"; Inhalte des Arrays, die Indexnummern per ECHO abgefragt, liefert genaue Informationen
$werte = "$row1[1]";
$datum = "$row1[2]";
$flag ="$row1[3]";
Ausgabe der Informationen
$abfrage = mysql_db_query($dbname1,$sql1); //or die(mysql_error());

$data = "$werte";
list($dat, $table, $typ, $blog, $bdat, $imp, $flag, $gps, $bter, $bper) = explode("\t", $werte);
echo ("blog=: $blog, terminalnummer=: $bter, Personalnummer=: $bper");


Dieser Codeschnipsel funktioniert vom Prinzip her, aber ich bekomme immer nur den ersten Datensatz des ursprünglichen Arrays angezeigt und nicht alle. Das zweite Ziel, alle Doppelten Daten raus zu filtern konnte ich also noch gar nicht in Angriff nehmen.

Vielleicht kann man bereits in der SQL Abfrage einstellen, daß nur die gewünschten Teilinformationen heruntergeladen werden. Dann kann ich das bestehende Array zur Ausgabe nutzen und darüber versuchen, den Filter zu setzen. Die explode Funktion wäre mir aber sympathischer.

Bin für jede Idee dankbar.

Schöne Grüße
Christof

Content-Key: 100162

Url: https://administrator.de/contentid/100162

Printed on: April 19, 2024 at 22:04 o'clock

Member: godlie
godlie Oct 24, 2008 at 15:30:44 (UTC)
Goto Top
Also prinzipiell:
Niemals mehrere Values in ein Feld schreiben, dass heist:
Wenn ich mehrere sachen hab, dann diese auch in mehrer Spalten aufteilen.
Vorteil: Ich kann suchen und sortieren und vieles mehr.

Aber nun zu deinem Problem:
Könntest du den Datensatz welcher aus der DB kommt mal in einer Form hier reinschreiben das man auch nachvollziehen kann wie der aussieht?
Kann leider aus dem was hier steht net wirklich was bauen.
Aber vom Prinzip her läuft sowas so ab:
$con = mysql_connect( "host", "user", "pw" ) or die( mysql_error() );  
$db = mysql_select_db( "dbname", $con ) or die( mysql_error() );  
$qry = mysql_query( "SELECT column(s) FROM table WHERE ... ", $cnn) or die( mysql_error() );  
$out = array();
while( $data = mysql_fetch_array( $qry ) ) {
  $explodedData = explode( "\t", $data );  
  // Jetzt sind je nachdem wo sich die gesuchten Werte befinden, die Indexes anzupassen
  $dat = $explodedData[1].", ".$explodedData[2].", ".$explodedData[3];  
  // Das aussortieren der Doppelten funktioniert in dieser Art http://at2.php.net/array_search
  if( !array_search( $dat, $out ) ) {
  // Jetzt tragen wir das ganze ein.
    $out = $dat;
  }
}
Ich glaub das ist das was du brauchst mal in Grundzügen.
Member: gechger
gechger Oct 24, 2008 at 15:59:50 (UTC)
Goto Top
na klar:
die Infos kommen in einer Zeile und sind mit TAB getrennt. Der Übersichtlichkeit halber schreibe ich sie mal untereinander:
2008-10-10_07:42:06 [TAB]
table=BB [TAB]
bTYP=10101 [TAB]
bLOG=1567[TAB]
bDAT=2008-10-10_07:39:57 [TAB]
bIMP=1 [TAB]
bFLAG=0 [TAB]
bGPS=V,5236.2929,N,01002.9705,E,[TAB]
bTER=5555 [TAB]
bPER=

Mal sehen ob ich alles verstehe.
Zeile 1 - 3 holt die Daten aus der SQL Datenbank.
in Zeile 4 wird das SQL-Array gefüllt.
Zeile 5 startet eine Schleife, die durch die Daten aus der Datenbank läuft, die dann
in Zeile 6 durch den explode Befehl nach TAB getrennt werden und die Ergebnisse in die Variable $explodeddata schreibt.
$explodeddata enthält jetzt das Array aus der explode Funktion
Da ich 10 TAB getrennte Felder habe, muß ich bei beginnend die benötigten Felder in $dat schreiben.
$dat kann dann mit echo ausgegeben werden.

Auf die Funktion !array_search bin ich noch nicht gestossen. Ich interpretiere das mal so, das die Werte aus $dat, also die bereits eingeschränkte Ausgabe, verglichen werden mit den Werten aus dem kompletten SQL-String. Ich bekomme dann den ersten passenden String zurück.

Mal sehen, mein String nach dem explode sieht etwas so aus:
bLOG=1234 bTER=5678 bPER=000123456789
Ist es richtig, daß die Search Funktion auch nur diese Werte vergleicht und bei doppeltem Vorkommen nur den ersten ausgibt?
Das wäre ja dann die Lösung. Ist da keine while Schleife nötig? DIe Ausgabe darf ja nicht nach dem ersten Treffer aufhören. Ich brauche alle "ungleichen" Sätze der SQL Abfrage.

Ich teste das mal aus.

Vielen vielen Dank für diesen Lösungsansatz.

Schöne Grüße
Christof
Member: godlie
godlie Oct 24, 2008 at 16:29:31 (UTC)
Goto Top
Also zu deinen Ansätzen:
Zeile 4 ist dafür da ein neues array zu initialisieren das leer ist für die Ausgabe dann.

Die Felder die du brauchst sind:

$explodedData[3], $explodedData[8], $explodedData[9]

Nein die array_search sucht nach einem bereits vorhanden Wert, wird dieser gefunden, so wird dessen Index ausgeben, wird dieser nicht gefunden wird FALSE zurückgegeben.
Mit dem ! vor der Funktion wird eine Negierung gemacht, sodass im Falle von FALSE ein TRUE zurückkommt und dann wird das in der If Schleife ausgeführt.

Alles weitere solltest beim versuchen rausbekommen.

grüße