gechger
Goto Top

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

Content-ID: 109252

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

ich1987
ich1987 17.02.2009 um 14:35:59 Uhr
Goto Top
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
gechger
gechger 17.02.2009 um 14:56:29 Uhr
Goto Top
Hallo Ich,

den Weg habe ich schon probiert. Aber das hat auch nicht so richtig funktioniert, weil ich die anderen zugehörigen Werte ja auch brauche.

Der Ansatz war, per Explode (was ja auch funktioniert) die bLog Werte auszulesen. Aber dann über das gesamte Array nach dem Wert zu sortieren klappte nicht. Es wurde weiterhin nach dem Datum sortiert.

Eine weitere Idee wäre, die Arrays ID zu verändern, also alle Werte bLog=00001 mit einer Id 1 zu versehen, alle bLog=00002 mit einer 2, usw. Dann könnte ich nach den Array Nummern sortieren. Da weiss ich aber auch nicht, wie ich das hinbekommen soll.

Vielleicht mit automatischen hochzählen oder so:
if blogX >blogY $id=i++

Mal sehen was mir dazu noch einfällt.

Aber vielen Dank erstmal für Deinen Tip
Schöne Grüße
Christof
godlie
godlie 17.02.2009, aktualisiert am 18.10.2012 um 18:37:46 Uhr
Goto Top
Ich will ja nicht vorschnell sein aber da hab ich dir schon geantwortet sogar mit Beispiel face-smile

Mysql order by sortieren nach definierten Informationen

habs gliech nach dem erstellen noch erweitert...
gechger
gechger 17.02.2009 um 15:47:08 Uhr
Goto Top
richtig face-smile
habs nur noch mal hier gepostet, weil die php Abfrage im Bereich MySql wahrscheinlich falsch plaziert wäre. Der erste Ansatz war ja, es in einer order by Funktion zu lösen. PHP Fragen sind hier sicher besser aufgehoben, auch wenns letztendlich um das Gleiche Problem geht.
dog
dog 18.02.2009 um 02:07:11 Uhr
Goto Top
Ich weiß zwar nicht warum du ein gelöstes Problem nochmal lösen willst, aber denn:

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 face-smile)

Grüße

Max
gechger
gechger 19.02.2009 um 09:43:13 Uhr
Goto Top
Hallo Max,

face-smile Du hast sicherlich recht, aber ich habe die Datenbank und die Datenübertragung nicht entworfen, Ich muß leider damit arbeiten, was mir vorgesetzt wurde und sehen, wie ich das Beste daraus mache. Ändern können wir es jedenfalls nicht mehr.

Aber jedenfalls vielen Dank für Deine Hilfe.

Schöne Grüße
Christof
Guenni
Guenni 21.02.2009 um 08:12:27 Uhr
Goto Top
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.

<?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
gechger
gechger 24.02.2009 um 14:05:37 Uhr
Goto Top
Hallo Günni,

so habe ich es jetzt gelöst:

if (empty($kundenname))
{
echo 'Zur Überprüfung der Einbauten bitte Kundennamen, Mobilmasternummer und Datum eingeben.','<br>';  
}
else
{
  $host1 = "h1332018.stratoserver.net";  
  $user1 = "$row[1]";  
  $kennwort1 = "$row[3]";  
  $dbname1 = "$row[2]";  
  $tabelle1 ="$row[4]";  
  $anmeldung="$row[5]";  

  $cldb = mysql_connect($host1, $anmeldung, $kennwort1); // or die(mysql_error());
  mysql_select_db($dbname1);
  $sql1 = ("SELECT * FROM $tabelle1 where werte like '%bLOG=$fahrzeug%' and werte like '%$datum%' and werte like '%btyp=$typ%' ");  
  $abfrage = mysql_db_query($dbname1,$sql1); // or die(mysql_error());

  ?></font></p>
                <font color="#291455">  
                        <table rules=row>
                                <?
  while($array = mysql_fetch_array($abfrage)){
        $werte=explode("\t", $array[1]);  
        $blogValue = ($werte[3]);
        $allInformation[$blogValue] = $werte;
        }
        ksort($allInformation);
        foreach($allInformation as $array1){
                 foreach($array1 as $array2){

?>
<table>
<tr>
<td width="40"><?echo $array2[1];?></td>  
<td width="100"><?echo $array2[2];?></td>  
<td width="100"><?echo $array2[3];?></td>  
<td width="200"><?echo $array2[4];?></td>  
<td width="100"><?echo $array2[5];?></td>  
<td width="100"><?echo $array2[6];?></td>  
<td width="260"><?echo $array2[7];?></td>  
<td width="100"><?echo $array2[8];?></td>  
<td width="100"><?echo $array2[9];?></td>  
</tr>
</table>
<?


                          }}

       }

?>
</font>

und es funktioniert tadellos.

Vielen Dank für Deine ausführliche Erkläreung.

Schöne Grüße
Christof