multidimensionalen array sortieren
multidimensionalen array sortieren
am 09.10.2006 14:54:10 von moritz
moin zusammen,
ich habe einen multidimensionalen array und möchte diesen nach den
unterschiedlichen schlüsseln sortieren.
das problem was ich habe ist das immer nur der ausgewählte schlüssel
sortiert wird aber der rest bei der alten sortierung bleibt.
z.b.:
$values = array("id" => array(), "titel" => array(),"autor" =>
array(),"autor_nname" => array());
sort($values["autor_nname"]);
der schlüssel "autor_nname" wird sortiert, aber der rest richtet sich nicht
nach der sortierung.
gibt es da schon eine fertige funktion die bei einem multidimensionalen
array auch den index mit neu sortiert oder muss ich mir da was selber
basteln?
Re: multidimensionalen array sortieren
am 09.10.2006 16:51:45 von Ulf Kadner
moritz wrote:
^^ Moritz was? Wir wissen hier gern mit wem wir kommunizieren!
> ich habe einen multidimensionalen array und möchte diesen nach den
> unterschiedlichen schlüsseln sortieren.
> das problem was ich habe ist das immer nur der ausgewählte schlüssel
> sortiert wird aber der rest bei der alten sortierung bleibt.
>
> $values = array("id" => array(), "titel" => array(),"autor" =>
> array(),"autor_nname" => array());
> sort($values["autor_nname"]);
>
> der schlüssel "autor_nname" wird sortiert, aber der rest richtet sich nicht
> nach der sortierung.
WiesolleineinzelnerSchlüsseldensortiertwerden?Dumeinstsicher wasanderes!
Evtl.suchstDujanachksort()?Sorryaberichmagkeineleerzeichenin sätzen,
aberDumagstjaauchkeineShift-Taste.:-)
MfG, Ulf
Re: multidimensionalen array sortieren
am 09.10.2006 19:58:02 von Helmut Chang
moritz schrieb:
> das problem was ich habe ist das immer nur der ausgewählte schlüssel
> sortiert wird aber der rest bei der alten sortierung bleibt.
>
> z.b.:
>
> $values = array("id" => array(), "titel" => array(),"autor" =>
> array(),"autor_nname" => array());
> sort($values["autor_nname"]);
>
> der schlüssel "autor_nname" wird sortiert, aber der rest richtet sich nicht
> nach der sortierung.
Dein Array hat ja auch die falsche Struktur. Hier ist keinerlei
zusammenhang zwischen den einzelnen Elementen der Subarrays gegeben. Wie
soll denn das Array $values['titel'] bspw. wissen, wie es in
Zusammenhang mit $values['autor_nname'] steht?
Ich gehe auf Grund deiner Frage davon aus, dass $values eine Sammlung
von Werken (Büchern, Songs?) darstellt.
Also brauchst du zuerst einmal eine Datenstruktur, die ein Buch
darstellt. Das wäre dann in deinem Fall dann wahrscheinlich ein Array
mit folgender Struktur:
$book = array(
'id' => ...,
'titel' => ...,
'autor' => ...,
'autor_nname' => ...
);
Und ein so ein Array ist dann eine Element des $values-Array, wobei dir
überlassen bleibt, ob das $values-Array irgendwelche Indizes verwendet
oder ob es bspw. die ID als Schlüssel verwendet:
$values = array(
$book['id'] => $book,
...
);
Und dann ist Sortieren ein Klacks, wobei ich selber grad nicht weiß, wie
die Funktion zum benutzerdefinierten sortieren heißt. usort() glaub ich.
gruss, heli
Re: multidimensionalen array sortieren
am 10.10.2006 15:07:33 von moritz
moin,
irgendwie stehe ich da noch auf dem schlauch. bzw. so wie du es beschrieben
hast hat es bei mir haargenau den gleichen effekt.
mein array erstelle und fülle ich wie folgt:
$praesentation =
array("id","titel","autor","autor_nname","autor_name","thema ","datum","status","gruppe","typ");
$values = array(
$praesentation['id'],
$praesentation['titel'],
$praesentation['autor'],
$praesentation['autor_nname'],
$praesentation['autor_name'],
$praesentation['thema'],
$praesentation['datum'],
$praesentation['status'],
$praesentation['gruppe'],
$praesentation['typ'],
);
$c = 0;
$result = mysql_db_query($db, "SELECT
id,titel,autor,thema,datum,status,gruppe,typ FROM praesentation") or die
(mysql_error());
while ($row = mysql_fetch_object($result)) {
$values["id"][$c] = $row->id;
$values["titel"][$c] = $row->titel;
$values["autor"][$c] = $row->autor;
$res_autor = mysql_db_query($db, "SELECT vname,nname FROM user WHERE
id='".$row->autor."'") or die (mysql_error());
$row_autor = mysql_fetch_object($res_autor);
mysql_free_result($res_autor);
$values["autor_nname"][$c] = $row_autor->nname;
$values["autor_name"][$c] = $row_autor->nname." ".$row_autor->vname;
$r_thema = mysql_db_query($db, "SELECT * FROM thema WHERE
id='".$row->thema."'") or die (mysql_error());
$row_thema = mysql_fetch_object($r_thema);
mysql_free_result($r_thema);
$values["thema"][$c] = $row_thema->name;
$values["datum"][$c] = date("d.m.Y" ,strtotime($row->datum));
$values["status"][$c] = $row->status;
$values["gruppe"][$c] = $row->gruppe;
$res_typ = mysql_db_query($db, "SELECT name FROM praesentationstyp WHERE
id='".$row->typ."'") or die (mysql_error());
$row_typ = mysql_fetch_object($res_typ);
mysql_free_result($res_typ);
$values["typ"][$c] = $row_typ->name;
$c++;
}
mysql_free_result($result);
$res_sort = mysql_db_query($db, "SELECT status FROM einstellungen WHERE
name='eingang_sort'") or die (mysql_error());
$r_sort = mysql_fetch_object($res_sort);
mysql_free_result($res_sort);
array_multisort($values[$r_sort->status]);
was aber bei der ausgabe der daten haargenau die gleiche wirkung hat wie ich
es vorher auch gemacht habe
----- Original Message -----
From: "Helmut Chang"
Newsgroups: de.comp.lang.php.misc
Sent: Monday, October 09, 2006 7:58 PM
Subject: Re: multidimensionalen array sortieren
>
> Dein Array hat ja auch die falsche Struktur. Hier ist keinerlei
> zusammenhang zwischen den einzelnen Elementen der Subarrays gegeben. Wie
> soll denn das Array $values['titel'] bspw. wissen, wie es in Zusammenhang
> mit $values['autor_nname'] steht?
>
> Ich gehe auf Grund deiner Frage davon aus, dass $values eine Sammlung von
> Werken (Büchern, Songs?) darstellt.
>
> Also brauchst du zuerst einmal eine Datenstruktur, die ein Buch darstellt.
> Das wäre dann in deinem Fall dann wahrscheinlich ein Array mit folgender
> Struktur:
>
> $book = array(
> 'id' => ...,
> 'titel' => ...,
> 'autor' => ...,
> 'autor_nname' => ...
> );
>
> Und ein so ein Array ist dann eine Element des $values-Array, wobei dir
> überlassen bleibt, ob das $values-Array irgendwelche Indizes verwendet
> oder ob es bspw. die ID als Schlüssel verwendet:
>
> $values = array(
> $book['id'] => $book,
> ...
> );
>
> Und dann ist Sortieren ein Klacks, wobei ich selber grad nicht weiß, wie
> die Funktion zum benutzerdefinierten sortieren heißt. usort() glaub ich.
>
> gruss, heli
Re: multidimensionalen array sortieren
am 10.10.2006 15:30:51 von Tobias Kutzler
moritz schrieb:
> moin,
>
> irgendwie stehe ich da noch auf dem schlauch. bzw. so wie du es beschrieben
> hast hat es bei mir haargenau den gleichen effekt.
> mein array erstelle und fülle ich wie folgt:
>
> $praesentation =
> array("id","titel","autor","autor_nname","autor_name","thema ","datum","status","gruppe","typ");
> $values = array(
> $praesentation['id'],
> $praesentation['titel'],
> $praesentation['autor'],
> $praesentation['autor_nname'],
> $praesentation['autor_name'],
> $praesentation['thema'],
> $praesentation['datum'],
> $praesentation['status'],
> $praesentation['gruppe'],
> $praesentation['typ'],
> );
> $c = 0;
> $result = mysql_db_query($db, "SELECT
> id,titel,autor,thema,datum,status,gruppe,typ FROM praesentation") or die
> (mysql_error());
Warum lässt Du nicht an dieser Stelle die Sortierung von der Datenbank
durchführen?! Das wäre nicht nur schneller, sondern auch wesentlich
einfacher. Die Daten werden dann schon sortiert in das Array eingefügt.
Hint: ORDER BY [column]
Ciao,
Tobias
Re: multidimensionalen array sortieren
am 10.10.2006 15:33:33 von moritz
weil dort z.b. auch nach namen der autoren sortiert werden soll. nur diese
namen stehen in einer anderen tabelle.
dynamische sortierung, je nachdem wonach der anwender sortieren möchte.
"Tobias Kutzler" schrieb im Newsbeitrag
news:4p1lkfFgo0nmU1@individual.net...
>
> Warum lässt Du nicht an dieser Stelle die Sortierung von der Datenbank
> durchführen?! Das wäre nicht nur schneller, sondern auch wesentlich
> einfacher. Die Daten werden dann schon sortiert in das Array eingefügt.
> Hint: ORDER BY [column]
>
> Ciao,
> Tobias
Re: multidimensionalen array sortieren
am 10.10.2006 15:46:05 von GreenRover
und was spricht gegen JOINS um die Tabellen so zusammen zu stellen, das
du sie 1A sortieren kannst.
Re: multidimensionalen array sortieren
am 10.10.2006 16:13:45 von moritz
ich wußte ich steh auf nem schlauch. danke! jetzt klappt das alles so wie es
soll...
obwohl mich das mit dem array immer noch interessiert
"GreenRover" schrieb im Newsbeitrag
news:452ba40f$0$30583$9b4e6d93@newsspool4.arcor-online.net.. .
> und was spricht gegen JOINS um die Tabellen so zusammen zu stellen, das du
> sie 1A sortieren kannst.
Re: multidimensionalen array sortieren
am 10.10.2006 16:18:26 von GreenRover
so z.B:
function cmp($a, $b)
{
global $sort_by;
if ($a[$sort_by] == $b[$sort_by])
return 0;
return ($a[$sort_by] < $b[$sort_by]) ? -1 : 1;
}
$sort_by = 'name'
usort ($deine_array, 'cmp');
Re: multidimensionalen array sortieren
am 10.10.2006 16:19:59 von Helmut Chang
moritz schrieb:
1.: Leg dir einen vollständigen Namen zu
2.: Google nach TOFU und lass das künftig bleiben
Sonst gibts keine Antworten mehr.
> irgendwie stehe ich da noch auf dem schlauch. bzw. so wie du es beschrieben
> hast hat es bei mir haargenau den gleichen effekt.
> mein array erstelle und fülle ich wie folgt:
>
> $praesentation =
> array("id","titel","autor","autor_nname","autor_name","thema ","datum","status","gruppe","typ");
> $values = array(
> $praesentation['id'],
> $praesentation['titel'],
> $praesentation['autor'],
> $praesentation['autor_nname'],
> $praesentation['autor_name'],
> $praesentation['thema'],
> $praesentation['datum'],
> $praesentation['status'],
> $praesentation['gruppe'],
> $praesentation['typ'],
> );
Genau so ja nicht.
$praesentation1 = array(
'id' => 1,
'titel' => 'Foo',
'autor' => 'Moritz',
...
);
$prasentation2 = array(
id' => 2,
'titel' => 'Bar',
'autor' => 'Heli',
...
);
$values = array(
$prasentation1['id'] => $prasentation1,
$prasentation2['id'] => $prasentation2,
...
);
Das in Bezug auf Struktur.
Und hier:
> $c = 0;
> $result = mysql_db_query($db, "SELECT
> id,titel,autor,thema,datum,status,gruppe,typ FROM praesentation") or die
> (mysql_error());
> while ($row = mysql_fetch_object($result)) {
> $values["id"][$c] = $row->id;
> $values["titel"][$c] = $row->titel;
> $values["autor"][$c] = $row->autor;
$values[$c]['id'] = $row->id;
$values[$c]['titel'] = $row->titel;
....
> was aber bei der ausgabe der daten haargenau die gleiche wirkung hat wie ich
> es vorher auch gemacht habe
Weil bei deiner Struktur kein Zusammenhang zwischen $values['id'][0] und
$values['titel'][0] besteht.
Aber sinnvoller wäre trotzdem in deinem Fall das ORDER BY von der DB
erledigen zu lassen.
> ----- Original Message -----
[TOFU entsorgt]
gruss, heli