Sortieren eines Arrays ?

Hello Guys

Ich möchte gerne ein array sortieren. Dieser Array beinhaltet Objekte von Typ Person, Person hat nur name und vorname sowie getter setter.

Nachdem google mich therapiert hat, habe ich folgendes geschrieben.



 foreach ($personenObjektListe->getPersonenListe() as $value) { // $personenObjektListe->getPersonenListe()  liefert das Array mit den Objekten
        echo "Entry: " . $value->getNachname() . "<br>";
    }
    
    echo "start sort:....";
    usort( $personenObjektListe->getPersonenListe(), 'comparatorPerson');
    
    echo "<br> ::::  print sortet list :::: <br>";
       foreach ($personenObjektListe->getPersonenListe() as $value) {
        echo "Entry: " . $value->getNachname() . "<br>";
    }


function comparatorPerson($p1, $p2) {
    return strcmp($p1->getNachname() , $p2->getNachname() );
    
}

Nun nach dem benutzen von usort( $personenObjektListe->getPersonenListe(), ‘comparatorPerson’); Hat sich mit der Liste nichts getan.

Ich verstehe leider nicht wo ich ein Fehler mache.

dann versuche ich mal meine allgemeinen Techniken auch in der PHP-Sprache:
nach hier
PHP: usort - Manual
die comparator-Funktion in richtigen Anführungszeichen übergeben, aber kann egal sein,
gibt es stattdessen Fehlermeldung wenn ‘hddgdgdf’ eingetragen?

kannst du in der comparatorPerson-Methode mit echo etwas ausgeben, kommt die Methode zahlreich dran?
Wert von strcmp() und auch beide Parameter ruhig dabei ausgeben, immer Wert 0 oder anderes?

ist die Liste zufällig schon sortiert? dann kein Wunder wenn es gleich bleibt ;), aufsteigend oder absteigend verwechseln man schnell

und noch am ehesten, wenn auch nicht wahrscheinlich:
kann es sein dass $personenObjektListe->getPersonenListe() jedesmal ein neues Array erzeugt?

3x in deinem Code ist für sich schon zuviel, selbst ohne Probleme,
kannst du das nur 1x abfragen und in eine kurze Variable pa ablegen (oder $pa, immer dieser Geldbezug…) ?


wenn gar nichts bisher geht, dann kopiere das Beispiel mit TestObj aus dem Link, geht hoffentlich?
wandle die Klasse nach und nach in eine zu deiner ähnlichen um, etwa Klassenname PersonTest, gleiche Attribute und Methoden
(nach und nach, nicht alles auf einmal ändern)
geht es mit direkt erzeugten Objekten?

geht es auch mit deiner Person-Klasse mit direkt befüllten Array?
dann wieder verstärkt auf personenObjektListe->getPersonenListe() schauen…

Der Punkt ist, Funktionskonstrukte können nicht direkt als Referenz übergeben werden. Nur Variablen und usort erwartet für den ersten Parameter eine Referenz. Und wenn du schon englische Ausgaben machst, dann programmier auf sauber englisch. Und wenn schon Objekte, kann auch die Compare-Funktion in der Klasse sein.

<?php

final class People
{
    private $people = array();

	public function all()
    {
		return $this->people;
    }

    public function compare(/* ... */)
    {
        // ...
    }

    // ...
}

$people = new People();

// wird halt irgendwie befüllt..

$sortedPeople = $people->all();
usort($sortedPeople, array($people, 'compare'));

foreach ($sortedPeople as $val) {
    // whatever
}

heißt das, dass usort intern nicht das übergebende Array-Objekt ändert (Java-Denkweise, vielleicht gar nicht möglich),
sondern ein neues Array zusammenbaut und dem Parameter zuweist?

na, wenn nicht hier dann in anderen Methoden,
wäre es dann nicht essentiel hilfreich zu prüfen, ob eine Referenz oder etwas anders übergeben wird?

nach
PHP: Parameter
gibt es einen ‚Fatal error seit PHP 5.0.5‘?
hast du das, @ZickZack ?

dort steht übrigens auch dass Funktionen durchaus Referenzen zurückgeben könnten, Beispiel mit direkter Übergabe foo(bar()) aber vielleicht unüblich :wink:

Wie usort das array manipuliert, keine Ahnung. Aber es wird halt das übergebene per Referenz zurückgegeben. Nicht via return. Wenn natürlich die Funktion auch eine Referenz zurückgibt, geht es natürlich direkter. Die Frage ist, ob man das will, dass der interne Instanzmember von außen so manipuliert werden kann.

*** Edit ***

Achja, das mit den Fatal Error wäre nett. Habe aber selbst gerade gestern eine Library überarbeitet die reset direkt auf Funktionen aufgerufen hat und das einzige was kam, war ein Notice. Und die sind standardmäßig nicht aktiv, wenn man nicht von selbst das error_reporting auf E_ALL hochdreht.