Problem array sortieren

Ich hab piti66's Anliegen aber so verstanden, dass er einen neuen Startindex (bzw. ein gewisses Startelement) festlegt und dann ab da angefangen weiter sortiert. Und alle die Elemente, die vor dem neuen Startindex/Element lagen, sollen dann sortiert hinten wieder angefügt werden...

Oh man hier stimmt mal das Sprichwort "den Wald vor lauter Bäumen nicht finden" haargenau. Habe mir die genaue Reihenfolge also die Zahlenlogik gar nicht angeschaut :D
Wieder mal ne freudsche Fehlleistung. Aber so gut hätte ichs eh nicht lösen können :thumbsup:
 
Hehe,
manchmal hab ich das mit den Bäumen auch - ist aber eher in der Analysis-Vorlesung der Fall XD.
Aber man muss auch mal über sich selbst lachen können - dann ist man Mensch geblieben.
Dafür ein Danke von mir...
 
Geht relativ einfach mit den Array-Funktionen die PHP uns zur Verfügung stellt
PHP:
<?php
//Test-Array
$array = array('a','b','c','d','e','f','g','h');
//Testaufrufe der Funktion
print_r(sortByKey($array, 4));
print_r(sortByValue($array, 'f'));


function sortByKey($array, $startKey) {
    //Index über die Schlüssel legen
    $index = array_keys($array);
    //Das Offset des Keys bestimmen
    $offset = array_search($startKey, $index);
    //Der Anfang des neuen Arrays extrahieren
    $startArray = array_slice($array, $offset, count($array) - $offset, true);
    //Das Ende des neuen Arrays extrahieren  
    $endArray = array_slice($array, 0, $offset, true);
    //Die beiden Teile zusammensetzen und zurückgeben
    return $startArray +$endArray; 
}

function sortByValue($array, $startValue){
    //Schlüssel des Wertes bestimmen
    $key = array_search($startValue,$array);
    //die SortByKey-Funktion darauf anwenden
    return sortByKey($array, $key);
}

?>
 
Ich liebe solche Spielereien. Darum habe ich das gnaze noche in wenig ausgebaut.
Diesen Erguss stelle ich in mein Wiki

PHP:
<?php
//Test-Array
$array = array(
                'a' => 'AA',
                'b' =>'BB',
                'c' => 'CC',
                'd' => 'DD',
                'e' => 'EE',
                'f' => 'FF',
                'g' => 'GG',
                'h' => 'HH');
//Testaufrufe der Funktion:
//Nach Index 4: Erste Paarung: 'e'=>'EE'
print("Nach Index 4:\n");
print_r(Reorder::byOffset($array, 4));
//Nach Schlüssel: Erste Paarung 'f' => 'FF'
print("Nach Schlüssel f:\n");
print_r(Reorder::byKey($array, 'f'));
//Nach Value: Erste Paarung 'c'=>'CC'
print("Nach Wert CC:\n");
print_r(Reorder::byValue($array, 'CC'));


class Reorder{
    /**
     * ändert die Reihenfolge. Beginnt den Array mit dem Eintrag mit der Position $offset
     * des Ausgangsarrays und hängt die vorgelagerten Einträge in unveränderter Reihenfolge hinten an
     * @param $array    Array   
     * @param $offset   Long
     * @return  Array oder false
     */
    public static function byOffset($array, $offset){
        //Test ob $offset nicht grössr als die Anzahl items ist
        if(count($array)-1 < abs($offset)) return false;
        //Der Anfang des neuen Arrays extrahieren
        $startArray = array_slice($array, $offset, count($array) - $offset, true);
        //Das Ende des neuen Arrays extrahieren  
        $endArray = array_slice($array, 0, $offset, true);
        //Die beiden Teile zusammensetzen und zurückgeben
        return $startArray +$endArray; 
    }
    
    /**
     * ändert die Reihenfolge analog zu rorderByOffset. sucht jedoch nach dem key
     * @param $array        Array
     * @param $startKey     Variant
     * @return  Array oder false
     */
    public static function byKey($array, $startKey) {
        //Index über die Schlüssel legen
        $index = array_keys($array);
        //Das Offset des Keys bestimmen
        $offset = array_search($startKey, $index);
        //Die reorder-Funktion nach Offset anwenden
        return ($offset ===false) ? false : self::byOffset($array, $offset); 
    }
    
    /**
     * ändert die Reihenfolge analog zu rorderByOffset. sucht jedoch nach dem Wert
     * @param $array        Array
     * @param $startValue   Variant
     * @return  Array oder false
     */
    public static function byValue($array, $startValue){
        //Schlüssel des Wertes bestimmen
        $key = array_search($startValue,$array);
        //die reorder-Funktion nach key anwenden
        return ($key ===false) ? false : self::byKey($array, $key);
    }
        
}

?>

Ausgabe:
Code:
Nach Index 4:
Array
(
    [e] => EE
    [f] => FF
    [g] => GG
    [h] => HH
    [a] => AA
    [b] => BB
    [ c] => CC
    [d] => DD
)
Nach Schlüssel f:
Array
(
    [f] => FF
    [g] => GG
    [h] => HH
    [a] => AA
    [b] => BB
    [ c] => CC
    [d] => DD
    [e] => EE
)
Nach Wert CC:
Array
(
    [ c] => CC
    [d] => DD
    [e] => EE
    [f] => FF
    [g] => GG
    [h] => HH
    [a] => AA
    [b] => BB
)
 
Tolle Sache Yaslaw - mich würde nur mal interessieren, wie du immer auf so ausgefeilte Algorithmen kommst (vllt. denke ich auch einfach immer nur um 500 Ecken...;-) )
 
Eine offene PHP-Hilfe-Datei ist sehr hilfreich. Es geht um Arrays, also schaue ich mal was für Array-Funktionen zur Verfügung stehen. Die meisten Array-Schleifen lassen sich durch Array-Funktionen ersetzen.
Wenn man ein Code hat, diesen nochmals durchgehen und schauen was man kürzen kann, welche Gemeinsamkeiten man auslagern kann etc.
Dann natürlich noch ein lokales XAMPP mit der ich eine Testdatei ausführen kann.
 
Nicht nur das, auch ne Menge Erfahrung in dem Bereich ist wohl sehr hilfreich :)
Umso mehr Erfahrung man sammelt, umso eher kommt man auf 'einfache' Loesungen.
 
Zurück