[PHP] Multidimensionales Array sortieren und durchsuchen

evident

Nachteule
ID: 12341
L
20 April 2006
497
56
Hallo,

ich möchte in einem Projekt eine Datenbank verwalten. Dies soll allerdings nur auf Dateien basieren, also keine MySQL-Nutzung etc.
Das gröbste funktioniert auch schon. Ich kriege die Dateien ausgelesen und in ein zweidimensionales Array gepackt. Speichern kann ich auch alles.

Beim Auslesen wird jede Zeile, die aus der Datei gelesen wird, in ein Array gepackt. Jede Zeile selbst wird mit explode() dann wieder in ein Array zerlegt. Ich erhalte also ein zweidimensionales Array, welches ich zur Übergabe zwischen den Seiten in der Session speichere. Beispiel:
$_SESSION['element'][2][0]
Gibt mir den Namen (also Feld 0) des dritten Eintrags im Array aus (geht ja bei null los)
also der erste Zahlenkey gibt immer den Datensatz an und der zweite Key das genaue Feld
  • 0=Name
  • 1=Bildlink
  • 2=Ort des Objekts
  • 3=Art des Objekts
  • 4=Farbe
  • 5=Größe
  • 6=Fach
u.s.w.

Hier ein Beispiel:
PHP:
Array
(
    [0] => Array
        (
            [0] => Eintrag 1
            [1] => Bildlink1
            [2] => 1
            [3] => 4
            [4] => 7
            [5] => 20
            [6] => Fach 1
            [7] => 
            [8] => 
            [9] => 
        )

    [1] => Array
        (
            [0] => Eintrag 2
            [1] => Bildlink+2
            [2] => 3
            [3] => 4
            [4] => 13
            [5] => 34
            [6] => Fach 2
            [7] => 
            [8] => 
            [9] => 
        )

    [2] => Array
        (
            [0] => Dritte Eintrag
            [1] => Bildlink3
            [2] => 1
            [3] => 1
            [4] => 11
            [5] => 33
            [6] => Fach
            [7] => 
            [8] => 
            [9] => 
        )

    [3] => Array
        (
            [0] => Der Vierte
            [1] => Testlink+Nummer+4
            [2] => 1
            [3] => 1
            [4] => 13
            [5] => 22
            [6] => Fach Nummer 4
            [7] => 
            [8] => 
            [9] => 
        )
)

Nun möchte ich das Array sortieren lassen.Also ich will zum Beispiel der Größe nach ordnen.Also nun soll das Array Zeilenweise nach der Größe geordnet werden.

Also ich will dann zum Beispiel eine Tabelle erstellen können, die ungefähr so aussieht (am Beispiel oben gemessen)
--> ASC (aufsteigend)

Name | Bildlink | Farbe | Größe | ...
Eintrag 1 | Bildlink 1 | 7 | 20 | ...
Der Vierte | Testlink+Nummer+4 | 13 | 22 | ...
Dritte Eintrag | Bildlink3 | 11 | 33 | ...
...

Ihr wisst schon, was ich meine. Als würde ich eine MySQL Tabelle auslesen und ORDER BY Größe ASC machen.

Nur wie kriege ich das bei den Arrays hin?
Zur Ausgabe muss ich das $_SESSION['element'] Array aber noch in ein anderes kopieren, damit die in der Session gespeicherten Daten nicht dauerhaft umsortiert werden, sondern nur für die Ausgabe, oder?
also $datenbank=$_SESSION['element'];
dann ist $datenbank[0][0] der Name des ersten Eintrags etc.

Kann mir da einer helfen?

Dann habe ich noch ein Problem: Ich will ich eine Suchfunktion einbauen.
Man soll ein Suchkriterium eingeben können... also wenn ich suche, wo Farbe=7 ist, soll er alle Datensätze finden, bei denen die Farbe = 7 ist.
(in MySQL: WHERE farbe=7)

Nur wie kriege ich das in dem Array hin?

Wäre echt nett, wenn ihr mir da helfen könntet!

-Flori-
 
I.) Hab's mir nicht genauer angeschaut, aber mir fiel folgende Funktion ein:

array_multisort
(PHP 4, PHP 5)

array_multisort -- Sortiert mehrere oder multidimensionale Arrays
Beschreibung
bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )


II.) Das ginge doch evtl. mit einer Schleife [foreach, etc.] und dann evtl. weiteren kleinen Tricks. Zum Beispiel mithilfe von:

in_array
(PHP 4, PHP 5)

in_array -- Prüft, ob ein Wert in einem Array existiert
Beschreibung
bool in_array ( mixed needle, array haystack [, bool strict] )​

(Ist ja immerhin nur zweidimensional.)

Edit: in_array ist (teilw./evtl.) Quark [geht aber evtl. eine Ebene höher schon; gibt auch noch eine Funktion, welche dir die Keys/Indizes liefert] in diesem Kontext... musst halt dann immer pro Key/Index das Element mit if mit dem gewünschten vergleichen!
 
hmm zu zweitens hab ich schon nen Ansatz...

mit foreach das Array durchgehen (also jeden Datensatz)
und dann kann man ja gucken, ob der jeweilige Wert des gewünschten zweiten Keys mit dem Suchkriterium überinstimmt...

zu I.

ja, aber irgendwie komme ich mit dem array_multisort() nicht ganz klar... ich raff das einfach nicht.


Edit: ich habe es jetzt nochmal etwas mehr mit array_multisort() versucht...

hier mein Ergebnis:
PHP:
$datenbank=$_SESSION['element'];


foreach ($datenbank as $key => $sort) {
   $krit1[$key]  = $sort['1'];
   $krit2[$key] = $sort['0'];
}


array_multisort($krit1, SORT_ASC, $krit2, SORT_ASC, $datenbank);

print_r($datenbank);

foreach ($datenbank as $key => $feld) {
echo"<b>$feld[0] | $feld[1] | $feld[2]</b><br>";
}

Das kommt heraus:
Eintrag 2 | Bildlink+2 | 3
Eintrag 1 | Bildlink1 | 1
Dritte Eintrag | Bildlink3 | 1
Das Fünfte | Hehehe | 0
Nummer S*x! | Sexlink+2 | 0
Der Vierte!2 | Testlink+Nummer+4 | 1

Also er listet nun die Zeilen nach $sort[1] aufwärts, also dem Bildlink...
Und als Zweitkriterium nimmt er den Namen als ASC...

kommt z.B. bei der Größe gut, weil da ja mehrere gleich sein können. Dann ordnet er erst nach Größe, dann nach Namen...

nun meine Frage? Ist das alles richtig geschrieben und effektiv? :D funktioniert das auch wirklich immer?

-Flori-
 
Zuletzt bearbeitet: