foreach Schleife

foreach Schleife

am 02.11.2006 10:08:20 von Andreas Bauer

Hallo NG,
mit einer foreach Schleife, die die Autorennamen aus der Datenbank einliest,
erzeuge ich eine Autorenliste. Da ein Autor mehrere Bücher
besitzen kann, kommen einige Autorennamen in der Autorenliste
doppelt oder drei-, vierfach etc. vor.
Wie kann ich das in der foreach Schleife verhindern?

Code:
$Books = $DbMapper->readBooks();
$Book): ?>


getAuthorLastName() ?>,
getAuthorFirstName() ?>: 




Grüße
Andreas

Re: foreach Schleife

am 02.11.2006 10:24:37 von Holger Pollmann

"Andreas Bauer" schrieb:

> mit einer foreach Schleife, die die Autorennamen aus der Datenbank
> einliest, erzeuge ich eine Autorenliste. Da ein Autor mehrere Bücher
> besitzen kann, kommen einige Autorennamen in der Autorenliste
> doppelt oder drei-, vierfach etc. vor.
> Wie kann ich das in der foreach Schleife verhindern?

Nun, es gibt da zwei Möglichkeiten.

Die eine Möglichkeit wäre, alle bereits abgearbeiteten Autorennamen
zwischenzuspeichern und jedes Mal abzuchecken, ob der jeweilige Name
schon vorkam.

Wesentlich sinnvoller wäre es aber, die Datenbank diese AUfgabe erledigen
zu lassen, indem man sie eine Liste aller Autoren erstellen läßt und
dabei anweist, keine doppelten Einträge zu liefern.

Die Art und Weise, wie du die Namen ermittelst:

$Book->getAuthorLastName()

klingt für mich darüber hinaus unpraktisch. Wenn ich eine Liste von
Autoren haben will, dann sollte ich mir nicht alle Bücher holen und deren
Autoren eruieren, sondern dann sollte ich direkt aus der Datenbank alle
unterschiedlichen Autoren extrahieren.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: foreach Schleife

am 02.11.2006 11:12:25 von Niels Braczek

Andreas Bauer schrieb:

> mit einer foreach Schleife, die die Autorennamen aus der Datenbank einl=
iest,
> erzeuge ich eine Autorenliste. Da ein Autor mehrere Bücher
> besitzen kann, kommen einige Autorennamen in der Autorenliste
> doppelt oder drei-, vierfach etc. vor.

Du hast also eine nicht normalisierte Datenbank.

> Wie kann ich das in der foreach Schleife verhindern?

Indem du Ein- und Ausgabe trennst.

> Code:
> $Books =3D $DbMapper->readBooks();
> $Book): ?>
>
>
> getAuthorLastName() ?>,
> getAuthorFirstName() ?>: 
>
>
>

$Books =3D $DbMapper->readBooks();
$authors =3D array();
foreach ( $Books as $Book ) {
$l =3D $Book->getAuthorLastName();
$f =3D $Book->getAuthorFirstName();
$authors["$f $l"] =3D "$l, $f";
}
foreach ( $authors as $author ) {
printf( '%s', $author );
}

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: foreach Schleife

am 02.11.2006 11:49:44 von Andreas Bauer

Holger Pollmann schrieb
> Andreas Bauer schrieb:
>> mit einer foreach Schleife, die die Autorennamen aus der Datenbank
>> einliest, erzeuge ich eine Autorenliste. Da ein Autor mehrere Bücher
>> besitzen kann, kommen einige Autorennamen in der Autorenliste
>> doppelt oder drei-, vierfach etc. vor.
>> Wie kann ich das in der foreach Schleife verhindern?
>
> Nun, es gibt da zwei Möglichkeiten.
> Die eine Möglichkeit wäre, alle bereits abgearbeiteten Autorennamen
> zwischenzuspeichern und jedes Mal abzuchecken, ob der jeweilige Name
> schon vorkam.
> Wesentlich sinnvoller wäre es aber, die Datenbank diese Aufgabe erledigen
> zu lassen, indem man sie eine Liste aller Autoren erstellen läßt und
> dabei anweist, keine doppelten Einträge zu liefern.
> Die Art und Weise, wie du die Namen ermittelst:
> $Book->getAuthorLastName()
> klingt für mich darüber hinaus unpraktisch. Wenn ich eine Liste von
> Autoren haben will, dann sollte ich mir nicht alle Bücher holen und deren
> Autoren eruieren, sondern dann sollte ich direkt aus der Datenbank alle
> unterschiedlichen Autoren extrahieren.

Da hast Du schon recht. Der Grund, weshalb ich das über das $Book Objekt etwas
umständlich mache ist:
Mit dem $Book Objekt kann ich die $authorid durch die Funktion $Book -> getAuthorId
bekommen. Die $authorid brauche ich zur weiteren Verwertung in den anderen
Dateien. Die $Book und deren Funktionen sind in einer bookclass.php
Klasse gekapselt.
Das andere Objekt, das $Author Objekt und deren Funktionen, sind in der Datei
authorclass.php gekapselt. Im $Author Objekt in der authorclass.php ist nur der
Nach- und Vorname.
Da müßte ich eine neue Funktion, $Author -> getAuthorId() erstellen, das Objekt $Author
umschreiben und dann für den ganzen restlichen Code mit ca. 45 Dateien anpassen.
Laß ich die foreach Schleife mit
$Author): ?>


getAuthorLastName() ?>,
getAuthorFirstName() ?>: 


laufen, streikt der komplette andere Code wegen der $authorid beim Abschicken des "aendern" Links .
Im den anderen Dateien bekomme ich dann mit dieser $authorid Fehlermeldungen.
Im $Author Objekt is nur der Nach- und Vorname enthalten, nicht die authorid. In der DB-Tabelle der
Autoren ist die authorid, der Nach-, und der Vorname (ein Feld Nach- und ein Feld Vorname) enthalten
Nehme ich das $Book Objekt streikt der übrige Code wegen des Auslesens der $authorid nicht:

Deshalb wäre die Varante, alle bereits abgearbeiteten Autorennamen
zwischenzuspeichern und jedes Mal abzuchecken, ob der jeweilige Name
schon vorkam, die bessere, bevor ich sämtliche Dateien ändern und umschreiben muß.
Hat einer eine Umsetzung für die Variante? Oder einen Tipp?

Grüße und Danke
Andreas

Re: foreach Schleife

am 02.11.2006 11:55:50 von Jens Riedel

Andreas Bauer wrote:

> Das andere Objekt, das $Author Objekt und deren Funktionen, sind in der
> Datei
> authorclass.php gekapselt. Im $Author Objekt in der authorclass.php ist
> nur der
> Nach- und Vorname.
> Da müßte ich eine neue Funktion, $Author -> getAuthorId() erstellen, das
> Objekt $Author
> umschreiben und dann für den ganzen restlichen Code mit ca. 45 Dateien
> anpassen.

Du hast Author-Objekte, die Name und Vorname, aber nicht die ID für die
DB-Zuordnung enthalten? Das würde ich als sehr verkorkstes Design
bezeichnen.
Das gleiche gilt für den Fall, dass das Hinzufügen einer Eigenschaft zu
einem Objekt die Änderung von anderen Dateien nach sich zieht, die
dieses Objekt verwenden.

Du solltest dein Design überdenken, je eher desto besser.

Gruß,
Jens

Re: foreach Schleife

am 02.11.2006 18:28:07 von Holger Pollmann

"Andreas Bauer" schrieb:

> Da hast Du schon recht. Der Grund, weshalb ich das über das $Book
> Objekt etwas umständlich mache ist:
> Mit dem $Book Objekt kann ich die $authorid durch die Funktion $Book
> -> getAuthorId bekommen. Die $authorid brauche ich zur weiteren
> Verwertung in den anderen Dateien.

Zunächst mal: dann bietet es sich an, for der foreach-Schleife einen
Array $found_authors (oder so) zu erzeugen und dann bei jedem
Schleifendurchgang si etwas zu machen:

if(!in_array($Book->getAuthorId, $found_authors)){
$found_authors[] = $Book->getAuthorId;
...
}

Da, wo die ... stehen, kommt dann der Ausgabecode. Wenn du das ganze mit
einem ID machen kannst, wird es nämlich eindeutig, wohingegen das
Speichern von Vor- und Nachnamen zusammen ja leider nicht eindeutig sein
muß (es können ja verschiedene Personen Hans Müller heißen). Nimm also
die ID dafür, wenn es denn sein muß. Aber:

> Das andere Objekt, das $Author Objekt und deren Funktionen, sind in
> der Datei authorclass.php gekapselt. Im $Author Objekt in der
> authorclass.php ist nur der Nach- und Vorname.
> Da müßte ich eine neue Funktion, $Author -> getAuthorId() erstellen,
> das Objekt $Author umschreiben und dann für den ganzen restlichen
> Code mit ca. 45 Dateien anpassen.

Was mußt du denn da anpassen? Alle die Stellen, die schon bisher die
Author-Klasse (nicht "das Objekt", btw, sondern vielmehr viele Objekte
von Typ der Author-Klasse, drum auch nicht "$Author-Klasse") benutzen,
werden doch von dessen zusätzlicher Funktionalität gar nicht beeinflußt
(bzw. sollten sie nicht - sonst sind sie alle mies geschrieben und
sollten eh umgeschrieben werden).

Davon abgesehen dürfte das Umschreiben der Author-Klasse kein Problem
sein. Mein Gott, du speicherst halt noch die ID. Viel mehr drüfte da
nicht dranhängen.

> Laß ich die foreach Schleife mit
> $Author): ?>
> [...]
>
> laufen, streikt der komplette andere Code wegen der $authorid beim
> Abschicken des "aendern" Links.

Vermutlich ist also der Array $Authors kein assoziativer Array, bei dem
die Author-ID als Schlüssel benutzt wurde. Dann sollte man das natürlich
auch nicht so benutzen.

> Im $Author Objekt is nur der Nach- und Vorname enthalten, nicht die
> authorid. In der DB-Tabelle der Autoren ist die authorid, der Nach-,
> und der Vorname (ein Feld Nach- und ein Feld Vorname) enthalten

Das klingt danach, als wäre schon die Author-Klasse verkorkst; warum
liest die nicht alle relevanten Daten aus?

> Deshalb wäre die Varante, alle bereits abgearbeiteten Autorennamen
> zwischenzuspeichern und jedes Mal abzuchecken, ob der jeweilige Name
> schon vorkam, die bessere, bevor ich sämtliche Dateien ändern und
> umschreiben muß. Hat einer eine Umsetzung für die Variante? Oder einen
> Tipp?

Das ist trivial, s.o.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: foreach Schleife

am 02.11.2006 22:15:11 von Hadanite Marasek

Du musst den SQL-String entsprechend formulieren. Wenn Du die Autoren
normalisiert hast, select autor from autor; wenn nicht, dann select
distinct autor from buecher, angenommen, in der spalte sei der autor
gespeichert.

wenn du einen join machst bzw. bei der distinct-abfrage andere Werte mit
abfragst, bekommst du den Autor natürlich mehrfach.

Sollte die Datenbank nicht normalisiert sein, rate ich Dir dringend, das
zu tun.

Andreas Bauer wrote:
> Hallo NG,
> mit einer foreach Schleife, die die Autorennamen aus der Datenbank
> einliest,
> erzeuge ich eine Autorenliste. Da ein Autor mehrere Bücher
> besitzen kann, kommen einige Autorennamen in der Autorenliste
> doppelt oder drei-, vierfach etc. vor.
> Wie kann ich das in der foreach Schleife verhindern?

Re: foreach Schleife

am 02.11.2006 22:52:03 von Martin Lemke

Andreas Bauer schrieb:

> kommen einige Autorennamen in der Autorenliste
> doppelt oder drei-, vierfach etc. vor.
> Wie kann ich das in der foreach Schleife verhindern?

Das solltest Du in Deinem SQL-String zum Abfragen der Datentabelle tun.

Martin