Zur Navigation

Array nach mehreren Kriterien sortieren

1 AndiN

Hallo,

ich habe folgendes Array:

ID	Einheit 	Beschreibung	Option
3 	5	                   1
183 	1 	1 kg               1
177 	1 	2 kg               3
178 	1 	5 kg               2

Nun möchte ich dieses Array zuerst nach dem Feld "Option" sortieren und dann nach dem Feld "Einheit", sodass es folgenden Aufbau hat:

ID	Einheit 	Beschreibung	Option
183 	1 	1 kg               1
3 	5	                   1
178 	1 	5 kg               2
177 	1 	2 kg               3

Leider finde ich in PHP keine Array-Funktion die das kann. Ich habe schon versucht mit diversen Schleifen zu experimentieren, finde aber einfach keinen Lösungsansatz. Evtl. denke ich gerade zu kompliziert.

Hat jemand eine Idee?

Gruß,
Andreas

16.09.2010 13:20

3 AndiN

Hallo Jörg,
danke für die Info.
Zumindest scheine ich jetzt auf dem richtigen Weg zu sein.
Mein Code sieht so aus:

foreach($array_spreis as $spreis)
{
    $array_staffelpreis[] = array(
    			'pid' => $spreis[0],
			'preis' => $spreis[1],
			'einheit' => $spreis[2],
			'produktbeschreibung' => $spreis[3],
			'optionen' => $spreis[4]);
}
foreach($array_staffelpreis as $key => $row)
{
    $array_einheit[$key]   = $row['einheit'];
    $array_option[$key]    = $row['optionen'];
}
array_multisort($array_einheit,SORT_DESC,$array_option,SORT_ASC,$array_staffelpreis);

Vor der Sortierung sieht $array_staffelpreis so aus:

Array (
    [0] => Array (
        [pid] => 3
        [preis] => 13.90
        [einheit] => 1
        [produktbeschreibung] => 1 kg (1kg = 13,90 €)
        [optionen] => 1 )
    [1] => Array (
        [pid] => 177
        [preis] => 19.90
        [einheit] => 1
        [produktbeschreibung] => 2 kg (1kg = 9,95 €)
        [optionen] => 2 )
    [2] => Array (
        [pid] => 178
        [preis] => 39.90
        [einheit] => 1
        [produktbeschreibung] => 5 kg (1kg = 7,98 €)
        [optionen] => 3 )
    [3] => Array (
        [pid] => 183
        [preis] => 12.90
        [einheit] => 5
        [produktbeschreibung] => 
        [optionen] => 1 )
)

Danach so:
Array (
    [0] => Array (
        [pid] => 183
        [preis] => 12.90
        [einheit] => 5
        [produktbeschreibung] => 
        [optionen] => 1 )
    [1] => Array (
        [pid] => 3
        [preis] => 13.90
        [einheit] => 1
        [produktbeschreibung] => 1 kg (1kg = 13,90 €)
        [optionen] => 1 )
    [2] => Array (
        [pid] => 177
        [preis] => 19.90
        [einheit] => 1
        [produktbeschreibung] => 2 kg (1kg = 9,95 €)
        [optionen] => 2 )
    [3] => Array (
        [pid] => 178
        [preis] => 39.90
        [einheit] => 1
        [produktbeschreibung] => 5 kg (1kg = 7,98 €)
        [optionen] => 3 )
)

Hier ist die Zeile mit einheit = 5 also nach ganz oben gerutscht. Richtig wäre aber:
Array (
    [0] => Array (
        [pid] => 3
        [preis] => 13.90
        [einheit] => 1
        [produktbeschreibung] => 1 kg (1kg = 13,90 €)
        [optionen] => 1 )
    [1] => Array (
        [pid] => 183
        [preis] => 12.90
        [einheit] => 5
        [produktbeschreibung] => 
        [optionen] => 1 )
    [2] => Array (
        [pid] => 177
        [preis] => 19.90
        [einheit] => 1
        [produktbeschreibung] => 2 kg (1kg = 9,95 €)
        [optionen] => 2 )
    [3] => Array (
        [pid] => 178
        [preis] => 39.90
        [einheit] => 1
        [produktbeschreibung] => 5 kg (1kg = 7,98 €)
        [optionen] => 3 )
)

Schlußendlich möchte ich folgende Ausgabe haben:

<table>
    <tr>
        <td>Produktbeschreibung</td>
        <td>Einheiten</td>
        <td>Preis</td>
    </tr>
    <tr>
        <td>1 kg (1kg = 13,90 €)</td>
        <td>1</td>
        <td>13.90</td>
    </tr>
    <tr>
        <td></td>
        <td>5</td>
        <td>12.90</td>
    </tr>
    <tr>
        <td>Produktbeschreibung</td>
        <td>Einheiten</td>
        <td>Preis</td>
    </tr>
    <tr>
        <td>2 kg (1kg = 9,95 €)</td>
        <td>1</td>
        <td>19.90</td>
    </tr>
    <tr>
        <td>Produktbeschreibung</td>
        <td>Einheiten</td>
        <td>Preis</td>
    </tr>
    <tr>
        <td>5 kg (1kg = 7,98 €)</td>
        <td>1</td>
        <td>39.90</td>
    </tr>
</table>

Das o.g. array_multisort()-Beispiel ist jetzt die Kombination von SORT_DESC / SORT_ASC die dem was ich brauche am nächsten kommt. Aber wirklich funktionieren tut es nicht wie man sieht. Was mache ich da falsch?

Gruß,
Andreas

17.09.2010 13:00

4 Jörg Kruse

Wenn du zuerst nach dem Feld "Option" und dann nach dem Feld "Einheit" sortieren möchtest, müssen die Funktions-Argumente denke ich auch in dieser Reihenfolge erfolgen

array_multisort($array_option, SORT_ASC, $array_einheit, SORT_DESC, $array_staffelpreis);

17.09.2010 14:30

5 AndiN

Das habe ich auch schonmal versucht.
Da bekomme ich dann folgende Ausgabe:

Array (
    [0] => Array (
        [pid] => 3
        [preis] => 13.90
        [einheit] => 1
        [produktbeschreibung] => 1 kg (1kg = 13,90 €)
        [optionen] => 1 )
    [1] => Array (
        [pid] => 177
        [preis] => 19.90
        [einheit] => 1
        [produktbeschreibung] => 2 kg (1kg = 9,95 €)
        [optionen] => 2 )
    [2] => Array (
        [pid] => 178
        [preis] => 39.90
        [einheit] => 1
        [produktbeschreibung] => 5 kg (1kg = 7,98 €)
        [optionen] => 3 )
    [3] => Array (
        [pid] => 183
        [preis] => 12.90
        [einheit] => 5
        [produktbeschreibung] => 
        [optionen] => 1 )
)

Was ich möchte ist den Eintrag mit der option = 1 und einheit = 5 direkt unter den ersten Eintrag ausgeben. Im Prinzip kannst du dir das so vorstellen wie ein Menü mit Untermenüpunkten. Alle Einträge die keine Produktbeschreibung haben sind Untermenüpunkte.

Ich schaue mal ob ich die Einträge ohne Produktbeschreibung in ein separates Array reinschiebe und in das optionen-Feld dann die pid des dazugehörigen Eintrages, dieses optionen-Array dann bei jedem Hauptmenüpunkt nach dazugehörigen Untermenüpunkten durchsuche.

Erscheint mir zwar etwas aufwändig, aber sollte so funktionieren.

20.09.2010 10:33

6 AndiN

zugrundeliegendes Array $array_staffelpreise

Array (
    [0] => 3|21|13.90|19|1|1 kg|0
    [1] => 177|21|19.90|19|1|2 kg|0
    [2] => 178|21|39.90|19|1|5 kg|0
    [3] => 179|21|77.90|19|1|10kg|0
    [4] => 183|21|12.90|19|5||3
    [5] => 184|21|11.90|19|10||3
    [6] => 185|21|29.90|19|5||178
);

Lösung:

for($x = 0; $x < count($array_staffelpreise); $x++)
{
    $array_staffelpreis = explode("|",$array_staffelpreise[$x]);
    if($array_staffelpreis[5] != "")
    {
?>
<tr>
    <td><?php echo $array_staffelpreis[5]; ?></td>
    <td><?php echo $array_staffelpreis[4]; ?></td>
    <td><?php echo $array_staffelpreis[2]; ?></td>
    <td><?php echo $array_staffelpreis[3]; ?></td>
</tr>
<?php
        for($y = 0; $y < count($array_staffelpreise); $y++)
        {
            $array_staffelpreistest = explode("|",$array_staffelpreise[$y]);
            if($array_staffelpreistest[6] == $array_staffelpreis[0])
            {
?>
<tr>
    <td><?php echo $array_staffelpreistest[5]; ?></td>
    <td><?php echo $array_staffelpreistest[4]; ?></td>
    <td><?php echo $array_staffelpreistest[2]; ?></td>
    <td><?php echo $array_staffelpreistest[3]; ?></td>
</tr>
<?php
            }
        }
    }
}
?>

20.09.2010 13:46

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]