Array nach Übergabeparameter sortieren


tklustig

Erfahrenes Mitglied
Hallo Leute, folgende PHP-Methode liefert folgendes array zurück
Methode:
PHP:
    public static function getPerson($fk, $IdBehaviour) {
        $x = $nachname = Person::find(['nachname' => 'value'])->where(['id_person_art' => $fk])->orderBy(['nachname' => SORT_ASC])->asArray()->all();
        var_dump(yii\helpers\ArrayHelper::map($x, 'id', 'nachname'));
        die();
        return yii\helpers\ArrayHelper::map($nachname, 'id', 'nachname');
    }
Array,welches die Methode liefert:
Code:
array(3) { [3]=> string(18) "Klein(Mitarbeiter)" [2]=> string(26) "Meyer-Schulze(Mitarbeiter)" [1]=> string(20) "Schwarz(Mitarbeiter)" }
Mit welchen PHP-Funktionen gelingt es mir am elegantesten, das Array so zu sortieren, dass der PK, also der Index des Arrays plus seinem Value als erstes Element im Array angezeigt wird. Die restlichen Arrayelemente tangieren dann nur noch peripher, da sein müssen sie halt noch!
Bin ma' gespannt auf die Vorschläge hier. Anbei noch eine Codevorlage meiner bisherigen Bemühungen

PHP:
    public static function getPerson($fk, $IdBehaviour) {
        $nachname = Person::find(['nachname' => 'value'])->where(['id_person_art' => $fk])->orderBy(['nachname' => SORT_ASC])->all();
        $items = array();
        foreach ($nachname as $value) {
            if ($value->id != $IdBehaviour) {
                /*
                 //Sortieralgorithmus hier
                 */

            } else {
                $items[$value->id] = $value->nachname;
            }
        }
        return $items;
    }
asArray() liefert das reine Array, ohne diese Methode bekomme ich ein Array aus Objekten zurück. Da ich das Resultat soweiso in ein reines Array umwandeln muss, ist es egal, welche Ausgangsbasis verwendet wird, Hauptsache, es beginnt mit $IdBehaviour als Key/Index
 
Zuletzt bearbeitet:

Kalito

Erfahrenes Mitglied
war bei deiner SQL-Frage $IdBehaviour nicht ein Array?


So aus der Hüfte heraus würde ich mir 2 Hilfs-arrays bauen und diese dann mit Array_merge wieder zusammenfügen.
PHP:
public static function getPerson($fk, $IdBehaviour) 
{
        $nachname = Person::find(['nachname' => 'value'])->where(['id_person_art' => $fk])->orderBy(['nachname' => SORT_ASC])->all();
        $sort = [];
        $rest = [];
        foreach ($nachname as $value) 
        {
           if ($value->id == $IdBehaviour)
           {
               $sort[$value->id] = $value->name;
           }
           else
           {
              $rest[$value->id] = $value->name;
           }       
           
           return array_merge($sort $rest);
        }
}
 

tklustig

Erfahrenes Mitglied
Nun, $IdBehaviour war schon immer ein Integer. So oder so ist das Problem allerdings gelöst. Ob ich Deine(kalito) Lösung oder gemäß Yaslaw nach dem Schlüssel sortiere, soll mein Chef entscheiden. Kannte schlichtweg weder die PHP-Funktion ksort noch array_merge(). Solange ich mich auf dem Boden des Frameworks befinde, ist alles okay, aber wehe, ich benötige PHP-Funktionen, dann wird's brenzlig. Gut, dass es dieses Forum gibt:cool:
 

tklustig

Erfahrenes Mitglied
Kalito, deine Lösung funktioniert nicht so, wie erwartet. Die restlichen Arrayelemente stehen nicht mehr zur Auswahl bereit. Die Eingangsfrage lautete:"..da sein müssen sie halt noch!"
ksort() funktioniert übrigens auch nicht, da ich dieser Funktion nicht begreiflich machen kann, dass nach $IdBehaviour sortiert werden soll:eek:
Erwarte also (wieder) Feedback...
Danke im voraus!
 
Zuletzt bearbeitet:

tklustig

Erfahrenes Mitglied
Sooo, habe jetzt selber eine Lösung gefunden, abseits der hier vorgestellten Ansätze. War eine realtiv schwere Gebur, funktioniert aber -Hier der Code, vielleicht hilft er jemand anderem mit einer ähnlichen Problematik weiter. Da ich objektorientiert programmiere, halfen mir die PHP-Manuals nur bedingt weiter:
PHP:
    private function Compare($a, $b) {
        if ($a == $b) {
            return 0;
        }
        return ($a > $b) ? -1 : 1;
    }

    public static function getPerson($fk) {
        $nachname = Person::find(['nachname' => 'value'])->where(['id_person_art' => $fk])->all();
        uksort($nachname, array(new Person(), "Compare"));
        return yii\helpers\ArrayHelper::map($nachname, 'id', 'nachname');
    }
 
Zuletzt bearbeitet:

tklustig

Erfahrenes Mitglied
Edit: Die gekapselte Methode ist so noch nicht korrekt. So wird richtig codiert:
PHP:
    private final function Compare($a, $b) {
        $objekt = new \common\wsl_components\Wsl_Blameable_Behavior();
        $IdBehaviour = $objekt->get_User_Person_Id();
        if (!empty(\common\modules\erweiterung\models\EKontakt::findOne(['id_person' => $IdBehaviour]))) {
            $Fk = \common\modules\erweiterung\models\EKontakt::findOne(['id_person' => $IdBehaviour])->id_person;
        } else {
            $Fk = \common\modules\erweiterung\models\EKontakt::findOne(['id_organisation' => $IdBehaviour])->id_organisation;
        }
        $b = $Fk;
        if ($a == $b) {
            return 0;
        }
        return ($a > $b) ? -1 : 1;
    }