• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Problem mit array_multisort

altilux

Neues Mitglied
Hey Leute,

ich habe ein Problem, mein mehrdimensionales Array zu sortieren.
Ich befürchte, dass ich im Ansatz der Anlegung des Arrays einen Fehler gemacht habe und daher die Soriterung nicht funktioniert...
Schaut selbst:

PHP:
$abfrage = "SELECT * FROM $db_shop_produkte WHERE freigabe = 1 AND cat = $cat_id ";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_object($ergebnis))
{ 
$produkt_id = $row ->id;
$produkt_preis = $row ->preis;
$produkt_headline = $row ->headline;
$produkt_bewertung_sterne = $row ->bewertung_sterne;
$produkt_bild_1 = $row ->bild_1;
$produkt_preis_alt = $row ->preis_alt;
$produkt_mwst = $row ->mwst;
$produkt_einheit = $row ->einheit;
$produkt_menge = $row ->menge; 
$produkt_text = $row ->text; 

$produkte[] = array('produkt_id' => $produkt_id, 
'produkt_preis' => $produkt_preis, 
'produkt_headline' => $produkt_headline,
'produkt_bild_1' => $produkt_bild_1,
'produkt_preis_alt' => $produkt_preis_alt,
'produkt_mwst' => $produkt_mwst,
'produkt_einheit' => $produkt_einheit,
'produkt_menge' => $produkt_menge,
'produkt_text' => $produkt_text,
'produkt_vmenge' =>1,
'produkt_bewertung_sterne' => $produkt_bewertung_sterne);
}

Wie ihr seht handelt es sich um Produktinformationen aus der DB, die in das Array geschrieben werden.

PHP:
// DATENSATZ SORTIEREN
if($sort == "preis" AND $order == "ASC") { array_multisort($produkt_preis, SORT_ASC, $produkte); } // sortieren nach Preis
elseif($sort == "preis" AND $order == "DESC") { array_multisort($produkt_preis, SORT_DESC, $produkte); } // sortieren nach Preis absteigend
elseif($sort == "headline" AND $order == "ASC") { array_multisort($produkte[], SORT_ASC, $produkte); echo "<br>SORTIERT<br>"; } // sortieren nach Name
elseif($sort == "headline" AND $order == "DESC") { array_multisort($produkt_headline, SORT_DESC, $produkte); } // sortieren nach Name absteigend
elseif($sort == "bewertung_sterne" AND $order == "ASC") { array_multisort($produkt_bewertung_sterne, SORT_ASC, $produkte); } // sortieren nach Bewertung
elseif($sort == "bewertung_sterne" AND $order == "DESC") { array_multisort($produkt_bewertung_sterne, SORT_DESC, $produkte); } // sortieren nach Bewertung absteigend
else

Eigentlich sollte diese Sortierung die Datensätze im Array sortieren, aber es kommt die Fehlermeldung

"Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in /var/www/web128811/html/content/content_shop.php on line 338"

Scheinbar ist der Array so nicht korrekt aufgebaut, doch leider brachte die SUFU mit dieser Felhlermeldung nicht den gewünschten Erfolg...

Ich habe dann bei php.net gefunden, dass der Array als Spalte umgebastelt werden muss, was ich dadurch versuchte:

PHP:
foreach ($produkte as $key => $row) {
$produkt_id[$key] = $row['produkt_id'];
$produkt_preis[$key] = $row['produkt_preis'];
$produkt_headline[$key] = $row['produkt_headline'];
$produkt_bild_1[$key] = $row['produkt_bild_1'];
$produkt_preis_alt[$key] = $row['produkt_preis_alt'];
$produkt_mwst[$key] = $row['produkt_mwst'];
$produkt_einheit[$key] = $row['produkt_einheit'];
$produkt_menge[$key] = $row['produkt_menge'];
$produkt_text[$key] = $row['produkt_text'];
$produkt_vmenge[$key] = $row['produkt_vmenge'];
$produkt_bewertung_sterne[$key] = $row['produkt_bewertung_sterne'];
}

Doch auch das brachte nicht den gewünschten Erfolg...

Kann mir bitte jemand helfen, wie ich den Array umbasteln muss oder wie die korrekte Sortierabfrage lauten muss?
Bin noch am verzweifeln...

DANKE!!!!
 
Wieso sortierst Du nicht schon im MySQL-Statement?

PHP:
$abfrage = "SELECT * FROM ".$db_shop_produkte."
WHERE freigabe = 1 
AND cat = ".$cat_id."
ORDER BY ".$sort." ".$order;
 
guten abend threadi.

Okay, das macht natürlich Sinn und würde funktionieren (die Tomaten wieder...)

Aber das löst mein Problem nicht grundsetzlich, will ich das mit der Array-Sortierung doch gern verstehen ;)
 
Wenn Du das Array nach Preisen sortieren willst, müsstest Du diese zunächst als Key festlegen. Da warst Du schon fast auf dem Weg, solltest aber in diesem Fall eher ansetzen, nämlich direkt nach dem Auslesen aus der DB:

PHP:
$produkte[$row->preis] = array('produkt_id' => $produkt_id, 
'produkt_preis' => $produkt_preis, 
'produkt_headline' => $produkt_headline,
'produkt_bild_1' => $produkt_bild_1,
'produkt_preis_alt' => $produkt_preis_alt,
'produkt_mwst' => $produkt_mwst,
'produkt_einheit' => $produkt_einheit,
'produkt_menge' => $produkt_menge,
'produkt_text' => $produkt_text,
'produkt_vmenge' =>1,
'produkt_bewertung_sterne' => $produkt_bewertung_sterne);

Und dann sortieren.

PHP:
array_multisort($produkte, SORT_ASC);
 
Wenn ich folgendes umschreibe:

PHP:
foreach ($produkte as $key => $row) { $produkt_headline[$key]= $row['produkt_headline'];}

PHP:
elseif($sort == "headline" AND $order == "ASC") { array_multisort($produkte, SORT_ASC); echo "<br>SORTIERT<br>"; } // sortieren nach Name
elseif($sort == "headline" AND $order == "DESC") { array_multisort($produkte, SORT_DESC); } // sortieren nach Name absteigend

Kommt zwar keine Fehlermeldung mehr, doch die Sortierung funkt nocht nicht...
Auch so komme ich zu keinem gewünschten Ergebnis:

PHP:
$produkte[$row->produkt_headline] = array('produkt_id' => $produkt_id,
'produkt_preis' => $produkt_preis,
'produkt_headline' => $produkt_headline,
'produkt_bild_1' => $produkt_bild_1,
'produkt_preis_alt' => $produkt_preis_alt,
'produkt_mwst' => $produkt_mwst,
'produkt_einheit' => $produkt_einheit,
'produkt_menge' => $produkt_menge,
'produkt_text' => $produkt_text,
'produkt_vmenge' =>1,
'produkt_bewertung_sterne' => $produkt_bewertung_sterne);

Irgendwo mache ich da einen Fehler -.-
 
Zuletzt bearbeitet:
Um nach Preisen zu sortieren:
PHP:
$abfrage = "SELECT * FROM $db_shop_produkte WHERE freigabe = 1 AND cat = $cat_id";
$ergebnis = mysql_query($abfrage);
$produkte = array();
while ($row = mysql_fetch_object($ergebnis)) { 
    $produkte[$row ->preis] = array(
        'produkt_id' => $row->id, 
        'produkt_preis' => $row->preis, 
        'produkt_headline' => $row->headline,
        'produkt_bild_1' =>  $row->bild_1,
        'produkt_preis_alt' => $row->preis_alt,
        'produkt_mwst' => $row->mwst,
        'produkt_einheit' => $row->einheit,
        'produkt_menge' => $produkt_menge,
        'produkt_text' => $row->text,
        'produkt_vmenge' =>1
    );
}  

$sortiert = ksort($produkte, SORT_NUMERIC);

Als Array-Key kannst Du auch $row->headline verwenden und ksort() als 2. Parameter SORT_STRING übergeben.
 
Zurück
Oben