Array in der 3. Dim Sortieren

Mairhofer

Erfahrenes Mitglied
Hallo Leute!

Komplexe Arrays sind irgendwie nicht mein Ding, das weiss ich.

Nun hab ich aber ein Problem, das ich nicht umgehen kann, zumindest hab nach mehreren Tagen keine Lösung gefunden.
Ich suche eine Möglichkeit um ein Array ausgehen von den Werten in der 3. Dimension zu sortieren.

Das Array sieht dann so aus:

PHP:
$a[107][21][name] = "Produkt A";
$a[107][21][betrag] = 20;
$a[34][21][name] = "Produkt B";
$a[34][21][betrag] = 5;
$a[444][7][name] = "Produkt C";
$a[444][7][betrag] = 100;
Das einzige, was in diesem Array statisch ist, sind 'name' und 'betrag'. Die Zahlen können sich wild ändern.
Sprich, ich möchte das Array nach dem Name des Produktes sortieren oder auch nach dem Betrag.

Wenn ich nach dem Betrag DESC sortiere, sollte dann rauskommen
PHP:
"Produkt C kostet 100"
"Produkt A kostet 20"
"Produkt B kostet 5"

Andersum sollte man es auch ASC sortien können, genauso wie beim Namen(ASC/DESC).
PHP:
"Produkt C kostet 100"
"Produkt B kostet 5"
"Produkt A kostet 20"
Ich habs schon mit diversen Hilfen per Google versucht, array_multisort() usw kann mir gerad auch nicht helfen.

Hat einer eine Idee wie man das realisieren kann?

Mfg
Mairhofer
 
Zuletzt bearbeitet:
Bei sowas nehme ich immer [phpf]usort[/phpf].
Du musst dann nur eine entsprechende Vergleichsfunktion schreiben.
Der Sinn Deiner zweiten Ebene will mir allerdings nicht so recht in Kopf.
Und Du solltest Deine "String"-Indizes auch als Strings schreiben und nicht als Konstante, das ist Zufall, dass es in diesem Fall richtig funktioniert.
Würde folgende Struktur Dein Problem nicht auch abbilden?
PHP:
$a[107]['name'] = "Produkt A";
$a[107]['betrag'] = 20;
$a[107]['nocheinwert'] = 21;
$a[34]['name'] = "Produkt B";
$a[34]['betrag'] = 5;
$a[34]['nocheinwert'] = 21;
$a[444]['name'] = "Produkt C";
$a[444]['betrag'] = 100; 
$a[444]['nocheinwert'] = 7;
Dann wäre die Vergleichsfunktion relativ einfach:
PHP:
function cmp ($a, $b) {
   if ($a['betrag'] == $b['betrag']) return 0;
   return ($a['betrag'] < $b['betrag']) ? -1 : 1;
}
function cmpReverse ($a, $b) {
   if ($a['betrag'] == $b['betrag']) return 0;
   return ($a['betrag'] > $b['betrag']) ? -1 : 1;
}
 
Ok, ich habs vergessen zu erklären.
Die erste Ebene ist die ID des Produktes aus der Datenbank. Die 2. ist eine Betrags ID aus der DB.
Da ich einen Auftrag in der Datenbank mit Produkt ID und Betrags ID speicher, und diese IDs halt in anderen Tabellen zu Werten führt, lese ich dann die DB so aus, das eine ProduktID im Bezug zu der Betrags ID steht.

Das hier geschriebene Beispiel ist sehr gekürzt.
Zu dem Namen und dem Betrag, kommt z.B. noch Anzahl.

Wenn ich jetzt das Arrays so bilden würde, das ich meine Betrags ID weglasse, wäre dan die Rechnunt Betrag * Anzahl falsch. Da einmal der Betrag 5 ist und einmal 10.

Das "kürzen" der ganzen geschichte währen der SQL Abfrage hab ich mir auch schon gestellt, jedooch brauche ich diese genau Auflistung (für eine Statistik) und ich muss dieses Statistik nach den Punkten halt sortieren können.

Komplexer sieht es dann so aus:

PHP:
$a[107][21][name] = "Produkt A";
$a[107][21][betrag] = 20;
$a[107][21][anzahl] = 5;

$a[34][21][name] = "Produkt B";
$a[34][21][betrag] = 5;
$a[34][21][anzahl] = 3;
$a[34][55][name] = "Produkt B";
$a[34][55][betrag] = 7;
$a[34][55][anzahl] =100;
$a[34][234][name] = "Produkt B";
$a[34][234][betrag] = 9;
$a[34][234][anzahl] = 1;

$a[444][7][name] = "Produkt C";
$a[444][7][betrag] = 100;
$a[444][7][anzahl] = 50;

Nun kann ich halt ebenfalls sortieren, bzw auch direkt die Summe zu Produkt B mit der Provision X anzeigen lassen, bzw die Gesamtsumme von Produkt B...

Man, ich bin so durcheinander, das ich glaub ich nicht mehr klar denken kann..

mit verzweifelten Grüssen,
Mairhofer
 
Du solltest Dir klar werden, wie sortiert werden soll ;)
1. Soll ein Produkt immer gruppiert mit allen "Unterbeträgen" zusammenstehen?
2. Ist das wesentliche Kriterium der Betrag eines "Unterbetrages" und ein und dasselbe Produkt soll nicht untereinander stehen?
3. Im Fall von 1. sollen die Produkte noch nach Maximumpreis, Minimumpreis, Durchschnittspreis, Summe aller "Unterbeträge" sortiert werden?

Das einfachste ist vermutlich, Du sortierst direkt im Query.
 
Ich glaub du hast recht...
Ich muss nochmal neues Konzept aufschreiben und da ich heut Nachtschicht hab, hab ich auch Zeit :D
Werde wohl nicht drum herum kommen, das ganze etwas zu stutzen und in der Query anfangen genauer zu arbeiten.

Ich bedanke mich erstmal, lasse den Threadstatus auf "Nicht erledigt" stehen und melde mich dann hier nochmal, wenn ich neu Ideen oder Probleme habe.

Bedankt,
Mairhofer
 
Zurück