Anne: Multidimensionale Array´s sortieren

Hallo,

ich hatte vor einigen Wochen hier im Forum schon einmal Glück mit einer Frage, daher versuche ich es glatt noch einmal ;-)

Ich habe ein (Mehrdimensionales Array) das ich nach dem ersten Wert sotieren lassen möchte:

es soll also aus

Array  
(  
    [0] => Array  
        (  
            [25000] => 28.90  
        )  
  
    [1] => Array  
        (  
            [15000] => 30.00  
        )  
  
    [2] => Array  
        (  
            [10000] => 36.00  
        )  
  
)

folgendes werden:

Array  
(  
    [0] => Array  
        (  
            [10000] => 36.00  
        )  
  
    [1] => Array  
        (  
            [15000] => 30.00  
        )  
  
    [2] => Array  
        (  
            [25000] => 28.90  
        )  
  
)

Ich habe glaube ich auch eine Lösung gefunden. Aber offenbar bin ich nicht in der Lage sie an zu wenden.

Mein Array heißt $gewicht_preis_array also

function vergleich($wert_a, $wert_b)  
			{  
      		// Sortierung nach dem zweiten Wert des Array (Index: 1)  
      		$a = $wert_a[1];  
			$b = $wert_b[1];  
  
			if ($a == $b) {  
				return 0;  
				}  
			return ($a < $b) ? -1 : +1;  
			}  
		usort($gewicht_preis_array, 'vergleich'); 

Ich bekomme mitten im Scriptablauf folgende Fehlermeldung :
<b>Fatal error</b>:  Cannot redeclare vergleich() (previously declared in...

  1. Moin

    Schau dir mal die Funktion array_multisort() an. Das könnte dir helfen

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    ### Henry L. Mencken ###
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ## Viktor Frankl ###
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Hi!

      Schau dir mal die Funktion array_multisort() an. Das könnte dir helfen

      Das könnte helfen, sie dauerhaft zu ignorieren, denn in den meisten Fällen hat man sein Array nicht so aufgebaut, wie es diese Funktion haben will.

      Lo!

  2. Hi!

    Ich bekomme mitten im Scriptablauf folgende Fehlermeldung :
    <b>Fatal error</b>:  Cannot redeclare vergleich() (previously declared in...

    Das liegt daran, dass du entweder die Funktionsdefinition in einer Schleife stehen hast oder in einer anderen Funktion, die mehrfach aufgerufen wird. Das geht nicht und ein wenig Suchen nach dem Wortlaut der Fehlermeldung hätte unter Garantie auch eine entsprechende Erläuterung ergeben. Stell den Funktionsaufruf "außerhalb" hin. Wo ist egal, nur nicht in eine Struktur, die mehrfach aufgerufen wird.

    [code lang=php]function vergleich($wert_a, $wert_b)
    {
           // Sortierung nach dem zweiten Wert des Array (Index: 1)
           $a = $wert_a[1];
    $b = $wert_b[1];

      	if ($a == $b) {  
      		return 0;  
      		}  
      	return ($a < $b) ? -1 : +1;  
      	}  
    

    Die Kurzform von obigem Code wäre:

    return $wert_b[1] - $wert_a[1];

    Es muss nicht exakt -1 oder +1 rauskommen, nur irgendwas im Negativen oder Positiven oder Null. Allerdings wirst du weder mit deiner noch mit meiner Version Glück haben, denn den Array-Index 1 kann ich in deinen Beispieldaten nicht erkennen.

    Lo!

  3. Hello Anne,

    Ich habe ein (Mehrdimensionales Array)
    das ich nach dem ersten Wert sotieren lassen möchte:

    möchstest Du die Schlüssel-Wertezuordnungen dabei wirklich verändern, oder nur die Anordnung der Elemente im Array?

    Es ist mir auch nicht einsichtig, wieso das Array nicht einfach nur so schlank aussieht.

    Array
    (
        [25000] => 28.90
        [15000] => 30.00
        [10000] => 36.00
    }

    In dieser reduzierten Form wird es auch sofort deutlich, dass du nach Schlüsseln sorieren willst und nicht nach Werten.

    Du könntest jetzt einen anderen Aufbau wählen für das Array, wenn Du sowohl die "Schlüssel" als auch die Werte als einander zugeordnete Elemente eines Datensatzes werten willst

    Array
    (
        [number] => Array
        (
            [0] => 25000
            [1] => 15000
            [2] => 10000
        )

    [decimal] => Array
        (
            [0] => 28.90
            [1] => 30.00
            [2] => 36.00
        )
    }

    Die Elemente ['number'] und ['decimal'] ergeben so je eine Spalte in einer Tabelle. Sie sind über ihren Index gebunden zu einem Datensatz. Die Indexe darf man nun freilich nicht mehr unkoordiniert  verändern. Aber Das muss man ja auch nicht.

    Der Vorteil ist nun aber, dass man die Standard-Arrayfunktionen auf jede einzelne Spalte anwenden kann. Je nachdem, nach welcher Spalte man das Array dann "abfährt" (iteriert mit foreach), hat man die Sortierung der Datensätze nach dieser Spalte. Man kann nun auch einfach die Summe Spalte bilden, das Minimum oder Maximum finden, usw.

    Um die Sätze zu bearbeiten, benötigt man nur ein paar immer wieder verwendbare Standardfunktionen in seiner Library.

    Die Funktionen findest Du hier:
    http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de