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

zweidimensionales assoziatives Array sortieren

Karl das kahle Moorhuhn

Neues Mitglied
Hallo Freunde,

ich lade aus einer Datenbank>PHP>JSON ein assoziatives Array (funktioniert), dass ich anschließend sortieren möchte.

Das Array ist folgendermaßen aufgebaut:

navigation["x"]["left"];

nun möchte ich das Array sortieren nach Werten auf der zweiten Ebene ("left").

Folgendermaße habe ich es probiert:

Code:
navigation = <?php echo json_encode($navigation); ?>;

function navSort(a,b)
{
	var result = 0;
	var sortColumn = "left";

	if (a[sortColumn] > b[sortColumn])
	{
		result = 1;
	} 
	else
	{
		result = -1;
	}
	
	return result;
} 

navigation.sort(navSort);


Allerdings funktionierts nicht und ich bekomme die Fehlermeldung: navigation.sort is not a function
 
Hallo
Ich kenne mich mit JS nicht aus, aber für mich ist das Problem eigentlich offensichtlich.
Du rufst eine Funktion navigation.sort() auf, nicht deine Funktion navSort().. der du im übrigen auch 2 Parameter übergeben willst, also solltest du das auch tun


edit: schwachfug :)
 
Zuletzt bearbeitet:
Und du kannst auf das JSON Objekt zugreifen?
Probier mal auf navigation[0]['left'] zuzugreifen.
Wenn nicht hast du nur einen String der wie ein JSON Objekt aufgebaut ist.
Dann kannst musst du den String noch evaluieren.

Code:
[FONT=Courier New] navigation = eval('(' + navigation + ')');[/FONT]

Das solte dann funktionieren :)
 
ka9de schrieb:
Du rufst eine Funktion navigation.sort() auf, nicht deine Funktion navSort().. der du im übrigen auch 2 Parameter übergeben willst, also solltest du das auch tun.

Das ist eine Sortierfunktion mit zwei Argumenten (die je zu vergleichenden Elemente), die an sort übergeben werden muss. Das passt schon so.

Gilles schrieb:
Wenn nicht hast du nur einen String der wie ein JSON Objekt aufgebaut ist.

json_encode gibt fertigen JS-Code zurück. Das passt also auch ohne eval.

Das Problem ist, dass json_encode bei der vorliegenden Array-Struktur ein Objekt generiert, kein Array. (JS kennt keine assoziativen Arrays. Das sind Objekte.) Die Eigenschaften von Objekten sind allerdings per Definition ungeordnet, also nicht sortierbar.

json_encode muss ein Array generieren.

PHP:
<?php

$navigation = array();

$navigation[] = array('name' => 'x', 'left' => 100);
$navigation[] = array('name' => 'y', 'left' => 150);
$navigation[] = array('name' => 'z', 'left' => 50);

?><!DOCTYPE html>

<html lang="en">

    <head>
        <meta charset="utf-8" />
        <title>New</title>
        <script type="text/javascript">
/*<![CDATA[*/
var navigation = <?php echo json_encode($navigation); ?>,
    i = 0,
    s = '';

function navSort(a, b)
{
	var sortColumn = "left";

	return (a[sortColumn] - b[sortColumn]);
}

navigation.sort(navSort);

for (i = 0; i < navigation.length; i++) {
    s += navigation[i].name + ' (' + navigation[i].left + ')';

    if (i < navigation.length - 1) {
        s += '; '
    }
}

alert(s);

/*]]>*/
</script>
    </head>

    <body>

    </body>

</html>
 
Zuletzt bearbeitet:
Zurück
Oben