Array nach meinem Wunsch sortieren

ddhb

Mitglied
also ich habe folgendes Array
PHP:
$array=array();
$array[]='RC 1';
$array[]='RC 2';
$array[]='Final 1';
$array[]='Final 2';
$array[]='Beta 1';
$array[]='Beta 2';
$array[]='Beta 3';

Ich will es aber so sortieren das es nacher folgende struktur hat:
PHP:
$array=array();
$array[]='Beta 1';
$array[]='Beta 2';
$array[]='Beta 3';
$array[]='RC 1';
$array[]='RC 2';
$array[]='Final 1';
$array[]='Final 2';

Also zuerst Beta dann RC und dann Final.

Kann mir da jemand einen Denkanstoß geben?

mfg
ddhb
 
Wenn Du Dir sicher sein kannst, dass bei allen Einträgen am Anfang immer entwerde "Beta" oder "RC" oder "Final" dann kannst Du ein bischen pfuschen. Erst das Array durchgehen und vor jedes Beta eine 1, vor jedes RC eine 2 und vor jedes Final eine 3 schreiben, dann das Array sortieren, dann wieder durchgehen überall das erste Zeichen wieder weghauen:
PHP:
$array = array("RC 2", "Final 3", "Beta 1", "Beta 3", "RC 1", "Final 1", "RC 3", "Final 2", "Beta 2");

function vorDemSortieren($a) {
  if (substr($a, 0, 2) == "Be") return "1" . $a;
  if (substr($a, 0, 2) == "RC") return "2" . $a;
  if (substr($a, 0, 2) == "Fi") return "3" . $a;
  return $a;
}

function nachDemSortieren($a) {
  if (substr($a, 0, 3) == "1Be") return substr($a, 1);
  if (substr($a, 0, 3) == "2RC") return substr($a, 1);
  if (substr($a, 0, 3) == "3Fi") return substr($a, 1);
  return $a;
}

array_map("vorDemSortieren", $array);
sort($array);
array_map("nachDemSortieren", $array);

echo nl2br(print_r($array, true));
Was einfacheres fällt mir auf die Schnelle nicht ein. Und wenn die oben erwähnten Voraussetzungen nicht gegeben sind, dann wird's eh komplizierte, fürchte ich..

Martin
 
[phpf]usort[/phpf] solltest Du Dir mal anschauen.
In der Vergleichsfunktion kannst Du zunächst den Anfang der Arrayelemente vergleichen und wenn dieses keinen Unterschied ergibt die beiden Strings direkt vergleichen.
 
@Resalb
Danke funktioniert.:)

@hpvw
hast du mal ein kleines Beispiel dazu, will mir die möglichkeit auch ansehen
 
Zuletzt bearbeitet:
Ein Beispiel, wie man es anwendet steht in der Hilfe.

Eine Konkrete Compare-Funktion könnte (ungetestet) für Dein Problem so aussehen:
PHP:
function cmp ($a, $b) {
    $aShort=arrays_shift(explode(" ",$a));   
    $bShort=arrays_shift(explode(" ",$b));   
    if ($aShort == $bShort) {
        if ($a == $b) return 0;
        return ($a < $b) ? -1 : 1;
    }
    if($aShort=="Beta") return -1;
    if($bShort=="Beta") return 1;
    if($aShort=="Final") return 1;
    if($bShort=="Final") return -1;
}
Den Vergleich kann man sicher noch vereinfachen.
Vielleicht auch so:
PHP:
function cmp ($a, $b) {
    //Reihenfolge definieren:
    $order=array();
    $order['Beta']=1;
    $order['RC']=2;
    $order['Final']=3;

    //String bis zum ersten Leerzeichen ermitteln
    //(geht vielleicht auch einfacher)
    $aShort=arrays_shift(explode(" ",$a));   
    $bShort=arrays_shift(explode(" ",$b));   

    //Wenn das Hauptkriterium gleich ist,
    //muss der ganze String verglichen werden
    if ($aShort == $bShort) {
        if ($a==$b) return 0;
        return ($a < $b) ? -1 : 1;
    }
    //Wenn die Hauptkriterien unterschiedlich sind,
    //wird nach der oben angegebenen Sortierreihenfolge
    //sortiert.
    return ($order[$aShort] < $order[$bShort]) ? -1 : 1;
}
Noch besser kann man [phpf]usort[/phpf] verwenden, wenn man zum Beispiel Arrays mit einzelnen Daten zu etwas hat (zum Beispiel ein Array, in dem Arrays hängen, die indiziert Informationen zu Dateien speichern, also Dateigröße, -name, etc).
PHP:
$array[0]['name']="datei1.txt";
$array[0]['size']="102";
$array[0]['changedate']="2005-01-10 18:23:10";
$array[1]['name']="datei2.txt";
$array[1]['size']="52";
$array[1]['changedate']="2004-12-31 15:45:07";
Mit Hilfe eines Parameters kann man sich dann entscheiden, nach welchem Kriterium (Index 2. Ebene) man $array sortiert.

Ich hoffe, ich konnte Dir [phpf]usort[/phpf] etwas näher bringen.

Gruß hpvw
 
Zurück