dedlfix: usort() - Verzweiflung naht!

Beitrag lesen

echo $begrüßung;

return strcmp(
  (int)!(bool)substr_count($person1[2], 'Funktion') . $person1[1] . $person1[0],
  (int)!(bool)substr_count($person2[2], 'Funktion') . $person2[1] . $person2[0]);

Danke für Deine Hilfe! Trotz Deiner ausführlichsten Erläuterung werde ich momentan noch nicht schlau aus Deinem Code... :-(
Aber ich studiere ihn noch weiter! Schließlich will ich ja den Grundgedanken dahinter verstehen...

Na dann will ich mal noch ein paar Worte dazu verlieren.

substr_count() zählt die Anzahl der Vorkommen eines bestimmten Strings (hier "Funktion") in einem anderen String ($personX[2]). Das Ergebnis ist eine Zahl (Integer-Wert).[*] Von Belang ist aber nur, zu wissen, ob "Funktion" vorhanden ist oder nicht. Wenn nicht => 0 (entspricht false) - wenn ja => >0 (entspricht true). Ein Typecast nach bool erledigt die Umwandlung.

Zwischenstand:
Funktionär = true (entspricht 1)
Fußvolk = false (entspricht 0)

Bei einer Sortierung würde 0 vor 1 kommen. Damit die Funktionäre "nach oben" kommen werden die durch die Negation zu false und das Fußvolk zur true. Der Typecast nach integer ergibt 0 bzw. 1.

Zwischenstand:
Funktionär = 0
Fußvolk = 1

[**]

Diese Ziffer, die ja auch als einstelliger String dargestellt werden kann, stellt die erste Sortierstufe dar. 0(null)irgendwas ist immer kleiner als 1(eins)igendwas - die Nullen kommen an die Spitze, aber das hab ich ja schon gesagt.

An die Ziffer wird direkt dahinter der Nachname und der Vorname gehängt, so dass sich solche Konstrukte ergeben:

1RiestererFelix
1RiesterErwin

(Funktionäre sind schon "wegsortiert".) Riester ist kleiner als Riesterer, muss also zuerst kommen. Da Vornamen mit Großbuchstaben beginnen wird das hier trotz des gleichen Buchstabens (e<->E) erreicht.

echo "$verabschiedung $name";

[*] strpos() täte es auch, liefert aber eine Positionsangabe, die auch 0 sein kann, und damit auch als false angesehen werden kann. Um das vom false bei Nichtvorhandensein zu unterscheiden, braucht's ein etwas umfangreicheres Konstrukt als einen Typecast.

[**] Statt (int)!(bool)substr_count($person1[2], 'Funktion') hätte man auch (substr_count($person1[2], 'Funktion') ? '0' : '1') nehmen können. Das ist nicht kürzer aber vielleicht besser verständlich.