PHP soll Werte nach definierten Informationen sortieren
in allen Anleitungen finde ich nur Sortierfunktionen, die nach Spalten inhalten funktionieren, ich brauche aber etwas Anderes
Hallo Forum,
nachdem ich mich nun reichlich mit sort(), usort(), ksort(), usw. beschäftigt habe, konnte ich trotzdem für meinen Sortierauftrag nichts passendes finden.
Aus einer MySql Datenbank bekomme ich in ein Array folgende Werte:
2009-02-17_12:54:32 table=BB bTYP=10103 bLOG=1488 bDAT=2009-02-17_12:53:49 bIMP= bFLAG=0 bGPS=V,4844.6661,N,01128.8240,E; bTER=6614 bPER=00000
Die Werte befinden sich in einer Tabellenspalte, die Felder sind durch TAB getrennt, also "bTYP=10103" TAB "bLog=1488" TAB usw.
Die üblichen Sortierregeln würden jetzt nach dem Datum vorne sortieren. Ich will die Daten aber nach dem Feld "bLOG" sortiert ausgeben, d.h. erst alle Werte mit Blog=00001, dann alle Werte blog=00002 usw. Dabei können je nach Abfrage bis zu 500 Datensätze im Array stehen und bis zu 40 verschieden Werte im bLog.
Wie bekomme ich das hin?
Jede Idee hilft weiter.
Schöne Grüße
Christof
Hallo Forum,
nachdem ich mich nun reichlich mit sort(), usort(), ksort(), usw. beschäftigt habe, konnte ich trotzdem für meinen Sortierauftrag nichts passendes finden.
Aus einer MySql Datenbank bekomme ich in ein Array folgende Werte:
2009-02-17_12:54:32 table=BB bTYP=10103 bLOG=1488 bDAT=2009-02-17_12:53:49 bIMP= bFLAG=0 bGPS=V,4844.6661,N,01128.8240,E; bTER=6614 bPER=00000
Die Werte befinden sich in einer Tabellenspalte, die Felder sind durch TAB getrennt, also "bTYP=10103" TAB "bLog=1488" TAB usw.
Die üblichen Sortierregeln würden jetzt nach dem Datum vorne sortieren. Ich will die Daten aber nach dem Feld "bLOG" sortiert ausgeben, d.h. erst alle Werte mit Blog=00001, dann alle Werte blog=00002 usw. Dabei können je nach Abfrage bis zu 500 Datensätze im Array stehen und bis zu 40 verschieden Werte im bLog.
Wie bekomme ich das hin?
Jede Idee hilft weiter.
Schöne Grüße
Christof
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 109252
Url: https://administrator.de/contentid/109252
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
8 Kommentare
Neuester Kommentar
moin,
also auf die schnelle fällt mir auch keine passende Lösung ein.
Also was gehen würde ist wenn du jedes Array-Objekt in mehere Arrays zerlegst durch z.B. die Funktion "explode".
Dann nach dem Array "bLOG" sortiert und wieder ein einziges array zusammensetzt.
Das würde funktionieren, aber wie schnell, bzw. welche performance braucht, kann ich dir nicht genau sagen.
Gruß ich
also auf die schnelle fällt mir auch keine passende Lösung ein.
Also was gehen würde ist wenn du jedes Array-Objekt in mehere Arrays zerlegst durch z.B. die Funktion "explode".
Dann nach dem Array "bLOG" sortiert und wieder ein einziges array zusammensetzt.
Das würde funktionieren, aber wie schnell, bzw. welche performance braucht, kann ich dir nicht genau sagen.
Gruß ich
Ich will ja nicht vorschnell sein aber da hab ich dir schon geantwortet sogar mit Beispiel
Mysql order by sortieren nach definierten Informationen
habs gliech nach dem erstellen noch erweitert...
Mysql order by sortieren nach definierten Informationen
habs gliech nach dem erstellen noch erweitert...
Ich weiß zwar nicht warum du ein gelöstes Problem nochmal lösen willst, aber denn:
Das würde bei deinem Beispiel funktionieren (Achtung: Ich habe hier Leerzeichen statt Tabs verwendet).
Und demnächst halten wir uns dann an die Grundregeln der RDBMS-Programmierung: 1. Normalform: Der Wert jeder Spalte muss atomar sein... oder auf Deutsch: Es macht in der Praxis nur unter bestimmten Bedingungen sinn mehr als einen Wert in einer Spalte zu benutzen (wie man hier grade prima sieht )
Grüße
Max
SELECT *,
SUBSTRING(t1.spalte FROM
CHAR_LENGTH(SUBSTRING_INDEX(t1.spalte,'=',3)) + 2
FOR
(
CHAR_LENGTH(SUBSTRING_INDEX(t1.spalte,' ',4))
-
CHAR_LENGTH(SUBSTRING_INDEX(t1.spalte,'=',3))
)
) AS blog
FROM tbl2 AS t1
ORDER BY blog ASC;
Das würde bei deinem Beispiel funktionieren (Achtung: Ich habe hier Leerzeichen statt Tabs verwendet).
Und demnächst halten wir uns dann an die Grundregeln der RDBMS-Programmierung: 1. Normalform: Der Wert jeder Spalte muss atomar sein... oder auf Deutsch: Es macht in der Praxis nur unter bestimmten Bedingungen sinn mehr als einen Wert in einer Spalte zu benutzen (wie man hier grade prima sieht )
Grüße
Max
Hi Christof,
ich nehme an, die Tabelle enthält 2 Spalten: Index und Werte.
Dann fragst du die Datensätze ab und speicherst die Werte in Unterarrays
in einem Array.
Oder, falls kein Index existiert, mußt du diesen für die Unterarrays selber
erstellen.
Mit . . .
. . . werden die Unterarrays ausgegeben, was dann so aussehen sollte:
Array
(
=> Array
(
=> 2008-10-08_09:41:08
[1] => table=BB
[2] => bTYP=10110
[3] => bLOG=1488
[4] => bDAT=2008-10-08_09:40:02
[5] => bIMP=
[6] => bFLG=1
[7] => bGPS=V,4808.5868,N,01133.6092,E,
[8] => bTER=6614
[9] => bPER=00000
[10] => 2008-10-08 09:41:08
[11] => 9
)
[1] => Array
(
=> 2008-10-08_09:41:32
[1] => table=BB
[2] => bTYP=10103
[3] => bLOG=1447
[4] => bDAT=2008-10-08_09:42:49
[5] => bIMP=
[6] => bFLG=1
[7] => bGPS=A,5229.3003,N,01323.6167,E,
[8] => bTER=6593
[9] => bPER=5009
[10] =>
[11] => 2008-10-08 09:41:32
[12] => 9
)
usw..
Diese Unterarrays kannst du dann z.B. mit uasort sortieren und dabei einen
Index eines Unterarrays als Sortierkriterium mit angeben.
Dazu benötigt uasort eine benutzerdefinierte Vergleichsfunktion.
Wie man sieht, hat bLog=xxxx den Index 3, also wird die Vergleichsfunktion
wie folgt definiert:
Sortiert werden die Unterarrays dann so:
Das Ganze in einem Stück:
Gruß
Günni
ich nehme an, die Tabelle enthält 2 Spalten: Index und Werte.
Dann fragst du die Datensätze ab und speicherst die Werte in Unterarrays
in einem Array.
<?php>
$query="select id,werte from tabelle4";
$result=mysql_query($query);
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$lines[$row['id']]=explode("\t",$row['werte']);
}
?>
Oder, falls kein Index existiert, mußt du diesen für die Unterarrays selber
erstellen.
<?php>
$query="select werte from tabelle4";
$result=mysql_query($query);
$i=0;
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$lines[$i]=explode("\t",$row['werte']);
$i++;
}
?>
Mit . . .
<?php>
echo "Ausgabe unsortiert<pre><br>";
print_r($lines);
echo "</pre>";
?>
. . . werden die Unterarrays ausgegeben, was dann so aussehen sollte:
Array
(
=> Array
(
=> 2008-10-08_09:41:08
[1] => table=BB
[2] => bTYP=10110
[3] => bLOG=1488
[4] => bDAT=2008-10-08_09:40:02
[5] => bIMP=
[6] => bFLG=1
[7] => bGPS=V,4808.5868,N,01133.6092,E,
[8] => bTER=6614
[9] => bPER=00000
[10] => 2008-10-08 09:41:08
[11] => 9
)
[1] => Array
(
=> 2008-10-08_09:41:32
[1] => table=BB
[2] => bTYP=10103
[3] => bLOG=1447
[4] => bDAT=2008-10-08_09:42:49
[5] => bIMP=
[6] => bFLG=1
[7] => bGPS=A,5229.3003,N,01323.6167,E,
[8] => bTER=6593
[9] => bPER=5009
[10] =>
[11] => 2008-10-08 09:41:32
[12] => 9
)
usw..
Diese Unterarrays kannst du dann z.B. mit uasort sortieren und dabei einen
Index eines Unterarrays als Sortierkriterium mit angeben.
Dazu benötigt uasort eine benutzerdefinierte Vergleichsfunktion.
Wie man sieht, hat bLog=xxxx den Index 3, also wird die Vergleichsfunktion
wie folgt definiert:
<?php>
function so($a, $b){
$Index=3; //Index von bLog=xxxx
return (strcmp($a[$Index],$b[$Index]));
}
?>
Sortiert werden die Unterarrays dann so:
<?php>
/*
Der Name der Vergleichsfunktion wird ohne Klammern in Anführungszeichen
der Funktion uasort zusammen mit dem Array übergeben.
*/
uasort($lines,"so");
?>
Das Ganze in einem Stück:
<?php>
$query="select id,werte from tabelle4";
$result=mysql_query($query);
while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
$lines[$row['id']]=explode("\t",$row['werte']);
}
/*
Benutzerdefinierte Vergleichs-Funktion
*/
function so($a, $b){
$Index=3;
return (strcmp($a[$Index],$b[$Index]));
}
/*
Ausgabe unsortiert
*/
echo "Ausgabe unsortiert<pre><br>";
print_r($lines);
echo "</pre>";
/*
Unterarrays sortieren
*/
uasort($lines,"so");
/*
Ausgabe nach bLog=xxxx sortiert
*/
echo "Ausgabe nach bLog=xxxx sortiert<pre><br>";
print_r($lines);
echo "</pre>";
?>
Gruß
Günni