mehrdimensionales Array sortieren, unterschiedliche Kettenlänge

kbs170

Grünschnabel
Hallo,

ich möchte ein mehrdimensionales Array sortieren, dass nicht an allen Stellen gleich lang ("stark", "mächtig" o.ä. Begriffe) ist. Die Funktion sort() sortiert mir jede "Mächtigkeit" getrennt.

Der Werdegang:
ich habe eine mysql-Tabelle "list_site" mit 3 Attributen (id, ger, site_id)

(ger für german)

1 deutschland NULL
2 tschechien NULL
3 bayern 1
4 thüringen 1
5 böhmen 2
6 hof 3
7 selb 3
8 hauptstraße 7

also mit mehrstufigen internen Verweisen. diese Tabelle übergeben ich an ein array. Jedes array-Element besteht dann aus eine Kette von Orten (selbst wieder ein array mit ortsrelevanten Attributen)

$feld=array(
array(array(deutschland,attribut)),
array(array(deutschland,attribut),array(bayern,attribut)),
array(array(deutschland,attribut),array(bayern,attribut),array(selb,attribut)),
usw.
);

dann folgt sort($feld) und die Ausgabe sieht so aus:

deutschland
tschechien
deutschland - bayern
deutschland - thüringen
tschechien - böhmen
deutschland - bayern - hof
deutschland - bayern - selb
deutschland - bayern - selb - hauptstraße

d.h. "sort()" priorisiert die Länge der Felder vor dem eigentlichen Sortiervorgang.
Die Ausgabe soll aber so aussehen:

deutschland
deutschland - bayern
deutschland - bayern - hof
deutschland - bayern - selb
deutschland - bayern - selb - hauptstraße
deutschland - thüringen
tschechien
tschechien - böhmen

Weiß jemand, wie das einfach geht? Ich brauche also eine Sortierfunktion, die Feldgrenzen ignoriert. Danke schon mal.
Gruß
Tim

wer sich für den Code interessiert:



PHP:
<?
function uebergeordneter_ort($id){
  global $connection;
  $query = "
      SELECT
        s.ger,s.site_id
      FROM list_site AS s
      WHERE s.id = '$id'
    ";
  $result_loop = query_sql($query,$connection);
  $feld=mysql_fetch_row($result_loop);
  return($feld);
  }

$query = "
    SELECT
      s.ger,s.site_id
    FROM list_site AS s
    ORDER BY s.ger
  ";
$result_site = query_sql($query,$connection);
$i = 0;
$k = 0;
$ort = array();
for ($i=0;$site[$i][0]=mysql_fetch_array($result_site);$i++){
  $j = 0;
  while ($site[$i][$j][1]){
    $site[$i][$j+1] = uebergeordneter_ort($site[$i][$j][1]);
    $j++;
    }
  }
for ($i = 0;$i<count($site);$i++) $site[$i] = array_reverse($site[$i]);
sort($site);
?>

    <ul><?
for ($i = 0;$i<count($site);$i++){
?>

      <li><?
  for ($j = 0;$j<count($site[$i]);$j++){
    echo $site[$i][$j][1],": ",$site[$i][$j][0]," - ";
    }
?>

      </li><?
  }
?>

    </ul>
 
da ich in einem anderen Forum einen Rüffel für schlechte Erklärungen bekommen habe, schiebe ich hier auch gleich noch eine hinterher:

Ich habe eine mehrstufige Hierarchie "Staat-Bundesland-Kreis-Kommune-Straße", die ich nicht in getrennten Tabellen lagere, sondern in genau einer. Jedes Level steht also ersteinmal gleichberechtigt als Datensatz ("Tupel") in der Tabelle ("Relation") untereinander. Das ist aus zwei Gründen praktisch:

1. ich erstelle nur eine Tabelle (minimiert Tippfehler / inkonsistenzen beim Auslesen), denn alle Level haben fast die gleichen Attribute: nämlich verschiedene Sprachen (Englisch, Fanzösisch, Deutsch)
2. ich bleibe variabel bei der Levelanzahl. Denn so kann ich schnell mal noch ein Level einfügen (z.B. Regierungsbezirke), ohne gleich alle Skripte umzustellen. Außerdem haben andere Länder andere Strukturen (keine Bundesländer, aber Regionen)

Durch ein und die selbe Tabelle ziehen sich also schöne Hierarchie-Ketten: Jede Straße hat eine Referenz zu einer Stadt, jede Stadt zu einem Kreis usw.

Trotzdem möchte ich zum Schluss die Hierarchie ausgeben. Das Problem ist auf jedenfall eineindeutig. Nur wie lösen? Die Suchabfrage für mysql ist sehr beschränkt, denn ich kann ja keine Bedingungen prüfen. JOIN auf die gleiche Tabelle geht zwar, aber ich lege mich ja nicht bei der Abfrage schon auf die Levelanzahl fest, was ich dabei müsste (Wie oft "SELF JOIN"?)

Um das zu lösen, habe ich mir ein mehrdimensionales php-Array überlegt: in jeder Zeile steht eine Hierarchie-Kette:

array(
array(Hierarchie-Kette 1),
array(Hierarchie-Kette 2),
array(Hierarchie-Kette 3),
);

Problem: die Hierarchie-Ketten sind unterschiedlich lang. Und der Befehl sort() sortiert jede Länge getrennt.

also vereinfacht so:

a
h
m
ab
hi
mn
abc
hij
mno

(Was dieses Beispiel nicht wiederspiegelt ist, dass jeder Buchstabe in einem eigenen array liegt, was auch der Grund für diese Sortierlogik ist.)

Danke schonmal für's nachdenken, falls jemand meinem Ausführungen bis hier gefolgt ist.

Gruß
Tim
 
Zurück