phpbar.de logo

Mailinglisten-Archive

[php] array_multiksort

[php] array_multiksort

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Sam Sep 30 10:03:45 CEST 2006


Hi Ringo,

Am Samstag, 30. September 2006 00:37 schrieb Ringo Großer:
> Ich war mir nicht ganz sicher. Gelesen hatte ich den Satz im Handbuch
> auch. Also es funktioniert mit eindeutigen Strings als assoziative
> Schlüssel. In meinem Beispiel $cars verwende ich solche, daher
> klappts dort.
> In meiner eigentlichen Anwendung hatte ich aber IDs als Schlüssel
> verwendet, die nur als Zahlen bestanden.

der Testaufbau sollte eben immer den genauen Sachverhalt 
widerspiegeln. :-)

> Trotzdem hatte ich 
> angenommen, dass PHP irgendwie den Unterschied zwischen einem
> $array[177] und einem $array['177'] mitbekommt. Aber leider geht PHP
> ja sehr locker mit Typen von Variablen um.

Dieser lockere Umgang mit Variablentypen ist ja das eine, aber der 
Hammer ist in diesem Fall, daß PHP die explizite Typenfestlegung 
schlicht und einfach ignoriert! Selbst wenn ich folgende Schreibweisen 
versuche, ist der Elementschlüssel dann vom Typ Integer:

	$aArray[''.'0'] = 'Audi';
	$aArray[(string) '1'] = 'BMW';
	$aArray[strval('2')]  = 'Honda';

Vielleicht gibt es ja einen guten Grund dafür, aber für mich wäre es 
zunächst mal ein Bug.

> Jedenfalls gingen diese IDs bei mir verloren. Ich habs nun mit einem
> Workaround gelöst und bin beim nächsten Mal schlauer.

Naja, was heißt Workaround... :-) Also auch wenn das oben aus meiner 
Sicht ein Bug ist, ist es ja immer noch so, daß Du als Zeichenketten 
formatierte Zahlen nur dann numerisch sortieren kannst, wenn Du die 
Zeichenketten alle auf dieselbe Länge bringst, indem Du sie mit 
führenden Nullen auffüllst (str_pad()), wobei wichtig ist, daß auch die 
größte Schlüsselzahl eine führende Null erhält. Ein Beispiel:

	$aArray['000'] = 'Audi';
	$aArray['001'] = 'BMW';
	$aArray['002'] = 'Honda';
	$aArray['003'] = 'Mazda';
	$aArray['004'] = 'Mercedes';
	$aArray['005'] = 'Nissan';
	$aArray['006'] = 'Opel';
	$aArray['007'] = 'Peugeot';
	$aArray['008'] = 'Renault';
	$aArray['009'] = 'Toyota';
	$aArray['010'] = 'VW';

Wenn Du den Schlüssel dann mal als Zahl brauchst, bekommst Du diese 
schnell mit intval() oder durch Multiplikation mit 1. :-)

Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive