Mehrere identische Einträge in einem Array
AK_CCM
- php
Hallo zusammen,
bin gerade dabei, für den Pilzverein Augsburg Königsbrunn e.V. eine Galerie basierend auf Coppermine aufzusetzen. Dabei wurde von vielen Mitgliedern neben der Thumbnail-Ansicht auch eine Artenliste ohne Vorschaubilder gewünscht. Leider habe ich keine nennenswerten PHP-Kenntnisse.
Bei der Suche nach einer Lösung stieß ich auf ein Script, das alle in der Galerie befindlichen Arten (title) auflistet und mit dem jeweiligen Bild verknüpft:
http://www.pilze-augsburg.de/galerie/fotoindex.php
1.) Im nächsten Schritt möchte ich jetzt hinter jeder Art in eckiger Klammer stehen haben, wieviele Bilder der entsprechenden Art in der DB vorhanden sind.
2.) Danach möchte ich die doppelten Einträge löschen, sodass jede Art nur einmal in der Liste ausgegeben wird, auch wenn z.B. 10 Bilder in der DB vorhanden sind.
3.) Im letzten Schritt möchte ich dann die Arten mit der Suchfunktion verlinken, s.h. wenn ich in der Liste z.B. auf "Cortinarius rubellus (Spitzgebuckelter Rauhkopf)" klicke, öffnet sich eine Seite mit den Suchergebnissen, auf der alle Bilder dieser Art als Thumbnails angezeigt werden - letzteres habe ich inzwischen hinbekommen:
http://www.pilze-augsburg.de/galerie/fotoindex2.php
Kann mir bitte jemand bei der Lösung von Problem 1 und 2 helfen?
Abschließend noch der Quellcode der fotoindex2.php:
<?php
define('IN_COPPERMINE', true);
require('include/init.inc.php');
pageheader("Artenliste der Galerie");
// Select all photos
$result = mysql_query("
SELECT pid, aid, title, caption, keywords
from {$CONFIG['TABLE_PICTURES']}
order by title
");
if (!mysql_num_rows($result)) cpg_die(ERROR, $lang_errors['non_exist_ap']);
$p_aid = -1 ;
// Result to table
starttable("100%", "Artenliste der Galerie", 3);
while ($row = mysql_fetch_array($result))
{
echo "<tr><td><a href="thumbnails.php?album=search&type=AND&search=$row[title]" title="$row[title]">$row[title]</a></td><td>$row[caption]</td><td>$row[keywords]</td></tr>";
$p_aid = $row[aid] ;
} ;
endtable();
pagefooter();
?>
Besten Dank im voraus!
Gruß, Andreas
hi,
1.) Im nächsten Schritt möchte ich jetzt hinter jeder Art in eckiger Klammer stehen haben, wieviele Bilder der entsprechenden Art in der DB vorhanden sind.
Du könntest die Art als Schlüssel eines assoziativen Arrays benutzen - und jedes mal, wenn ein neuer Eintrag zu dieser Art auftaucht, zählst du den Wert im Array hoch.
Art "xyz" taucht auf.
Gibt es schon einen Eintrag im Array mit dem Schlüssel "xzy"?
Wenn ja, zähle dessen Wert hoch,
wenn nein, initialisiere dieses Array-Element mit dem Wert 0.
2.) Danach möchte ich die doppelten Einträge löschen, sodass jede Art nur einmal in der Liste ausgegeben wird, auch wenn z.B. 10 Bilder in der DB vorhanden sind.
Doppelte Einträge bekommst du mit dieser Methode gar nicht erst.
gruß,
wahsaga
Hi wahsaga,
Du könntest die Art als Schlüssel eines assoziativen Arrays benutzen - und jedes mal, wenn ein neuer Eintrag zu dieser Art auftaucht, zählst du den Wert im Array hoch.
Art "xyz" taucht auf.
Gibt es schon einen Eintrag im Array mit dem Schlüssel "xzy"?
Wenn ja, zähle dessen Wert hoch,
wenn nein, initialisiere dieses Array-Element mit dem Wert 0.
Danke für Deinen Lösungsansatz. Leider kann ich das programmiertechnisch mangels Können nicht umsetzen.
Unabhängig davon habe ich jetzt wenigstens herausgefunden, wie ich doppelte Einträge in der Artenliste vermeide - hierzu habe ich die DB-Abfrage:
$result = mysql_query("
SELECT pid, aid, title, caption, keywords
from {$CONFIG['TABLE_PICTURES']}
order by title
");
geändert in:
$result = mysql_query("
SELECT DISTINCT title
from {$CONFIG['TABLE_PICTURES']}
order by title
");
Aber die Frage ist jetzt, wie ich an die Anzahl der gleichen title-Einträge gelange und diese hinter den aufgelisteten Arten ausgeben kann...
Doch zur Not reicht auch schon die Liste ohne Anzahl der Bilder pro Art.
Gruß, Andreas
hi,
Unabhängig davon habe ich jetzt wenigstens herausgefunden, wie ich doppelte Einträge in der Artenliste vermeide - hierzu habe ich die DB-Abfrage [...] geändert [...]
Aber die Frage ist jetzt, wie ich an die Anzahl der gleichen title-Einträge gelange und diese hinter den aufgelisteten Arten ausgeben kann...
Du musst dich entscheiden, was du erzeugen willst, und wie.
Wenn du in MySQL DISTINCT anwendest, bekommst du zu jedem title nur noch einen Datensatz - zählen is' dann nicht mehr.
Da könntest du stattdessen COUNT() und GROUP BY verwenden.
Mein Vorschlag würde _alle_ Datensätze in PHP zur Verfügung benötigen (auf grund deiner ersten Beshcreibung war ich von diesem Fall ausgegangen).
Aber wenn du gar nicht alle brauchst, wäre es besser das schon Datenbankseitig zu lösen.
gruß,
wahsaga
Hallo wahsaga,
Du musst dich entscheiden, was du erzeugen willst, und wie.
das habe ich doch schon im Initial-Posting erklärt? Und Dank Deinen Erläuterungen kann ich mir jetzt ungefähr vorstellen, wie man das Ganze umsetzen kann. Wie gesagt: Habe von PHP egtl. keine Ahnung.
Wenn du in MySQL DISTINCT anwendest, bekommst du zu jedem title nur noch einen Datensatz - zählen is' dann nicht mehr.
Das leuchtet sogar mir ein - aber zumindest habe ich mit MySQL DISTINCT schon Mal eine Linksliste ohne doppelte Einträge parat, die ich notfalls verwenden kann. Lieber wäre mir natürlich die Lösung mit den angezeigten Bilderzahlen pro Art.
Da könntest du stattdessen COUNT() und GROUP BY verwenden.
Kennst Du eine Befehlsreferenz im Netz, wo ich mich über die Funktionen erkundigen kann?
Mein Vorschlag würde _alle_ Datensätze in PHP zur Verfügung benötigen (auf grund deiner ersten Beshcreibung war ich von diesem Fall ausgegangen).
Aber wenn du gar nicht alle brauchst, wäre es besser das schon Datenbankseitig zu lösen.
Egtl. brauche ich für mein Vorhaben nur die Datensätze der title-Spalte. Datenbankseitig bedeutet ohne COUNT() und ohne GROUP BY?
Gruß, Andreas
hi,
Da könntest du stattdessen COUNT() und GROUP BY verwenden.
Kennst Du eine Befehlsreferenz im Netz, wo ich mich über die Funktionen erkundigen kann?
Datenbankseitig bedeutet ohne COUNT() und ohne GROUP BY?
Nein, mit.
gruß,
wahsaga