NatürlicheSortierung bei der Ausgabe einer Datenbankabfrage?
NatürlicheSortierung bei der Ausgabe einer Datenbankabfrage?
am 14.02.2006 20:19:15 von Alexander Beck
Moin :)
Mein Problem: In einer Chemikaliendatenbank soll die Ausgabe (Name,
Summenformel usw.) anhand der Summenformel sortiert werden, also so daß ein
Eintrag mit C5H8 vor einem erscheint, bei dem als Summenformel C42H70
eingetragen ist.
php kennt zwar den Befehl usort($array,"strnatcmp"), dieser ist jedoch nur
auf eindimenasionale Arrays anwendbar.
Gibt es eine einfache Möglichkeit, die Ausgabe eines mehrdimensionalen
Arrays mit einer "natürlichen Sortiermethode" anzeigen zu lassen?
Alex
Re: Natürliche Sortierung bei der Ausgabe einer Datenbankabfrage?
am 14.02.2006 21:58:50 von Niels Braczek
Alexander Beck schrieb:
> Mein Problem: In einer Chemikaliendatenbank soll die Ausgabe (Name,
> Summenformel usw.) anhand der Summenformel sortiert werden, also so daß ein
> Eintrag mit C5H8 vor einem erscheint, bei dem als Summenformel C42H70
> eingetragen ist.
Also
$formulae = array(
array('name' => 'Pentan', 'formula' => 'C5H8'),
array('name' => 'Watweetik', 'formula' => 'C42H70'),
...
);
> php kennt zwar den Befehl usort($array,"strnatcmp"), dieser ist jedoch nur
> auf eindimenasionale Arrays anwendbar.
usort funktioniert durchaus mit mehrdimensionalen Arrays. Du muss nur
eine passende Vergleichsfunktion liefern
> Gibt es eine einfache Möglichkeit, die Ausgabe eines mehrdimensionalen
> Arrays mit einer "natürlichen Sortiermethode" anzeigen zu lassen?
Ja.
function my_cmp($a, $b)
{
return strnatcmp($a['formula'], $b['formula']);
}
usort($formulae, 'my_cmp');
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
------------------------------------------------------------ ----
Re: NatürlicheSortierung bei der Ausgabe einer Datenbankabfrage?
am 15.02.2006 19:41:42 von Alexander Beck
Yap, thx, damit bin ich schon mal viel weiter gekommen.
Ich hab jetzt nur noch das Problem, daß Summenformeln ohne Zahlen zwischen
den einzelnen Atomen ganz zum Schluß einsortiert werden.
Wenn z.B. in der Datenbank die Summenformeln C2H5, CH4 und C10H28 stehen
erfolgt die Ausgabe in der Reihenfolge C2H5, C10H28, CH$.
Mal sehn wie ich das hingebogen bekomme.
Alex
Re: NatürlicheSortierung bei der Ausgabe einer Datenbankabfrage?
am 16.02.2006 00:54:05 von Alexander Beck
Alexander Beck wrote:
> Wenn z.B. in der Datenbank die Summenformeln C2H5, CH4 und C10H28 stehen
> erfolgt die Ausgabe in der Reihenfolge C2H5, C10H28, CH$.
>
> Mal sehn wie ich das hingebogen bekomme.
>
> Alex
Hier die Lösung:
function chemencode($text) {
$replace="";
$marker=0;
for ($i=0;$i< strlen($text);$i++) {
$a=ord($text[$i]);
if (($a>63) and ($a<91) and ($marker==1)) {
$replace=$replace."1".$text[$i];
} else {
$replace=$replace.$text[$i];
}
if (($a>47) and ($a<58)) {
$marker=0;
} else {
$marker=1;
}
}
return $replace;
}
function chemdecode($text) {
$replace="";
$marker=0;
for ($i=0;$i< strlen($text);$i++) {
$a=ord($text[$i+1]);
if (($text[$i]=="1") and ($a>63) and ($a<91)) {
echo"";
} else {
$replace=$replace.$text[$i];
}
}
return $replace;
}
Chemencode baut in einen String, bei dem ein Großbuchstabe eine Position
nach einem anderen Buchstaben befindet, eine 1 ein. Aus CH3O5 wird also
C1H3O5. Nach der Sortierung wird die Summenformel wieder gesäubert, indem
der String an chemdecode übergeben wird.
Klappt hier ganz gut, mal sehn ob ich Fehler finde.
Alex
Re: Natürliche Sortierung bei der Ausgabe einer Datenbankabfrage?
am 16.02.2006 01:17:17 von Niels Braczek
Alexander Beck schrieb:
> Hier die Lösung:
>
> function chemencode($text) {
> $replace="";
> $marker=0;
> for ($i=0;$i< strlen($text);$i++) {
> $a=ord($text[$i]);
> if (($a>63) and ($a<91) and ($marker==1)) {
> $replace=$replace."1".$text[$i];
> } else {
> $replace=$replace.$text[$i];
> }
> if (($a>47) and ($a<58)) {
> $marker=0;
> } else {
> $marker=1;
> }
> }
> return $replace;
> }
>
>
> function chemdecode($text) {
> $replace="";
> $marker=0;
> for ($i=0;$i< strlen($text);$i++) {
> $a=ord($text[$i+1]);
> if (($text[$i]=="1") and ($a>63) and ($a<91)) {
> echo"";
> } else {
> $replace=$replace.$text[$i];
> }
> }
> return $replace;
> }
Das geht wesentlich einfacher, wenn man RegExp benutzt:
function chemEncode($str)
{
return preg_replace('~(\D)([A-Z])~', '${1}1$2', $str);
}
function chemDecode($str)
{
return preg_replace('~(\D)1([A-Z])~', '$1$2', $str);
}
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
------------------------------------------------------------ ----
Re: NatürlicheSortierung bei der Ausgabe einer Datenbankabfrage?
am 16.02.2006 12:17:11 von Alexander Beck
Yap, hast recht :)
Thx für die Hilfe.
Alex