Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wenn Wert in Array mehrfach vorhanden, nur einmal ausgeben?!

28 views
Skip to first unread message

Bernhard Kaiser

unread,
Jan 1, 2001, 10:39:38 AM1/1/01
to
Hallo NG,

mein hoffentlich wohl vorerst letztes Problem (welches ich
trotz meines neuen PHP-Buchs noch nicht lösen konnte...).
Also:

Ich lese alle Dateien aus einem Verzeichnis aus,
'includiere' sie und speichere dann die Variable $artist aus
den ausgelesenen Dateien in ein $array_artist. Nun kann es
sein, dass die Variable $artist mehrmals den selben Wert
hat, ich möchte jedoch nicht x-mal die Variabel $artist
ausgeben, sondern nur einmal, welche von den $artist dateien
das dann ist, spielt keine Rolle. Anbei der Code bis jetzt,
mit Mehrfachausgabe:

<?
$dir = "../events/art/";
$handle=opendir($dir);

while( ($file = readdir($handle)) != false) {
if ($file != "." && $file != ".." && $file)
{
include ($dir.$file);
$array_artist[$file] = $artist;
}
}
asort($array_artist);

foreach($array_artist as $file => $datei_artist)
{
include ($dir.$file);
$today = date ("Y-m-d");
if ($date1 >= $today) {
echo ("...");
}
}
closedir($handle);
?>

Also meine Idee wäre die Variable $artist in eine andere
Variable z.B. $artist_2 zu laden und wenn gleich, dann
irgendwas, aber das funzt nicht wirklich...

Vielen Dank!

Bernhard


Henrik Motakef

unread,
Jan 1, 2001, 10:53:30 AM1/1/01
to
Bernhard Kaiser <au...@topmail.de> wrote:
> Nun kann es sein, dass die Variable $artist mehrmals den selben Wert
> hat, ich möchte jedoch nicht x-mal die Variabel $artist
> ausgeben, sondern nur einmal,

Meinst du sowas wie array_unique()?

hth
Henrik

--
Quote of the day: '

Bernhard Kaiser

unread,
Jan 1, 2001, 11:04:11 AM1/1/01
to
Henrik Motakef <henrik....@ruhr-uni-bochum.de> schrieb
in im Newsbeitrag: q59q29...@duke.hmotakef.de...

Hm, ich habe mal in meinen zwei php Manuals gesucht, aber
nichts dazu gefunden, also, wenn 'unique' bedeuten soll,
dass das Array zwar mehrere Variablen aufnimmt, aber nicht
kein Wert zwei Mal vorkommen kann, dann meine ich das ;-)

Nehmen wir an, es werden folgende Werte aus den include
Dateien ausgelesen:

$artist[0] = "Heinz";
$artist[1] = "Peter";
$artist[2] = "Heinz";
$artist[3] = "Klaus";

dann wäre im Array zu finden:

array_unique("Heinz","Peter","Klaus")

Das ist es, was ich suche.

Bernhard


Henrik Motakef

unread,
Jan 1, 2001, 11:11:38 AM1/1/01
to
Bernhard Kaiser <au...@topmail.de> wrote:
> Hm, ich habe mal in meinen zwei php Manuals gesucht, aber
> nichts dazu gefunden,

http://www.php.net/array_unique

> also, wenn 'unique' bedeuten soll,
> dass das Array zwar mehrere Variablen aufnimmt, aber nicht
> kein Wert zwei Mal vorkommen kann, dann meine ich das ;-)

Du übergibst der Funktion ein Array als Parameter, und sie liefert ein
Array zurück, in dem jeder Wert nur einmal vorkommt. Also nicht

> $artist[0] = "Heinz";
> $artist[1] = "Peter";
> $artist[2] = "Heinz";
> $artist[3] = "Klaus";

> dann wäre im Array zu finden:

> array_unique("Heinz","Peter","Klaus")

Sondern

array_unique( $artists ) == array( "Heinz", "Peter", "Klaus" )

(Was vermutlich aber false ergeben wird, weil array_unique die Keys
beibehält ;-)

Bernhard Kaiser

unread,
Jan 1, 2001, 11:32:43 AM1/1/01
to
Henrik Motakef <henrik....@ruhr-uni-bochum.de> schrieb
in im Newsbeitrag: q7aq29...@duke.hmotakef.de...

> Bernhard Kaiser <au...@topmail.de> wrote:
> > Hm, ich habe mal in meinen zwei php Manuals gesucht,
aber
> > nichts dazu gefunden,
>
> http://www.php.net/array_unique

Nur interessehalber, ist das erst ab der 4.0.4 verfügbar
oder schon vorher? Habe nämlich vor Kurzem ein PHP-Buch
geschenk bekommen, in dem das nicht aufgeführt ist.

>
> > also, wenn 'unique' bedeuten soll,
> > dass das Array zwar mehrere Variablen aufnimmt, aber
nicht
> > kein Wert zwei Mal vorkommen kann, dann meine ich das
;-)
>
> Du übergibst der Funktion ein Array als Parameter, und sie
liefert ein
> Array zurück, in dem jeder Wert nur einmal vorkommt. Also
nicht
>
> > $artist[0] = "Heinz";
> > $artist[1] = "Peter";
> > $artist[2] = "Heinz";
> > $artist[3] = "Klaus";
>
> > dann wäre im Array zu finden:
>
> > array_unique("Heinz","Peter","Klaus")
>
> Sondern
>
> array_unique( $artists ) == array( "Heinz", "Peter",
"Klaus" )
>
> (Was vermutlich aber false ergeben wird, weil array_unique
die Keys
> beibehält ;-)

stimmt ;-)

>
> hth
> Henrik
>

Funktioniert aber wunderbar. Zuerst hats ewig gedauert, bis
die Seite geladen war, aber dann fiel mir auf, des der
MySQL-Server nicht lief und deswegen andere Funktionen
beeinträchtigt waren... hat mir zuerst nen Schrecken
eingejagt, weils echt lange gedauert hat. Ist aber exakt
das, was ich gesucht habe!

Vielen Dank!

Bernhard


Henrik Motakef

unread,
Jan 1, 2001, 11:41:01 AM1/1/01
to

> Nur interessehalber, ist das erst ab der 4.0.4 verfügbar
> oder schon vorher? Habe nämlich vor Kurzem ein PHP-Buch
> geschenk bekommen, in dem das nicht aufgeführt ist.


Wer lesen kann, ist klar im Vorteil ;-)

[http://www.php.net/array_unique]
(PHP 4 >= 4.0.1)
...

> Ist aber exakt das, was ich gesucht habe!
> Vielen Dank!

Gerne

Bernhard Kaiser

unread,
Jan 1, 2001, 1:42:18 PM1/1/01
to
Also, nächstes Problem, der Server, auf dem das PHP-Skript
laufen soll, hat nur PHP 4.0.0 installiert und da geht die
Funktion "array_unique()" nicht. Also folgende Möglichkeit
habe ich probiert, aber da ist irgendwo ein Fehler drin,
vielleicht jemand eine Ahnung was für einer?

(Zur Erinnerung: Aus allen Dateien die includiert werden
soll die Variable $artist ausgelesen werden und wenn sie
mehrmals vorkommt nur einmal ausgeben, also im Prinzip das,
was "array_unique" von alleine macht...)

$dir = "../events/art/";
$handle=opendir($dir);

while( ($file = readdir($handle)) != false) {
if ($file != "." && $file != ".."

{
include ($dir.$file);

$array_file[$artist] = $tmpartist;

}
}

$result = array();

foreach($tmpartist as $tmpartist_2) {

$found = false;

foreach($a as $artist_2) {
if ($a = $tmpartist) {
$found = true;
break;
}
if (!$found) {
$artist_2[] = $tmpartist_2;
}
}
}


Henrik Motakef

unread,
Jan 1, 2001, 2:08:39 PM1/1/01
to
Bernhard Kaiser <au...@topmail.de> wrote:
> Also, nächstes Problem, der Server, auf dem das PHP-Skript
> laufen soll, hat nur PHP 4.0.0 installiert und da geht die
> Funktion "array_unique()" nicht. Also folgende Möglichkeit
> habe ich probiert, aber da ist irgendwo ein Fehler drin,
> vielleicht jemand eine Ahnung was für einer?

Was denn für ein Fehler?

Ich würde das übrigens etwas anders angehen (und dräng mich dir damit
mal auf ;.). Da die Array-Funktionen IMHO sehr nützlich sind, sollte
man sie implementieren, dass man sie auch für andere Zwecke benutzen
kann. Ist auch gar nicht schwer:

Zuerst implementiert man eine Funktion, die in_array() nachbildet:

function in_array( $needle, $haystack )
{
if (!is_array( $haystack )) {
trigger_error( "Wrong parameter type" , E_USER_ERROR );
}

for ($i=0; $i < count( $haystack ); $i++ ) {
if ($haystack[$i] == $needle) {
return 1;
}
}

return 0;
}


Dann kann man recht einfach ein array_unique basteln:

function array_unique( $array )
{
$unique = array();

while (list( $key, $val ) = each( $array )) {
if (!in_array( $val, $unique )) {
$unique[$key] = $val;
}
}

return $unique;
}


So kannst du auch mit PHP3 und älteren PHP4-Versionen die jeweiligen
Funktionen nutzen. Wenn du das ganze in ein include()-File auslagerst,
brauchst du nur das include() zu löschen, wenn du auf eine neuere
Version umsteigst, und hast dann die bessere Performance der
eingebauten Funktionen.

Übrigens habe ich die Funktionen nicht getestet ;-)

Henrik
(der sich überlegt, ob es nicht sinnvoll wäre, sich die Arbeit zu
machen, die ganzen Array-Funktionen PHP3-konform nachzubauen)

Bernhard Kaiser

unread,
Jan 1, 2001, 2:23:43 PM1/1/01
to
Henrik Motakef <henrik....@ruhr-uni-bochum.de> schrieb
in im Newsbeitrag: njkq29...@duke.hmotakef.de...

Hm...
Fatal error: Cannot redeclare in_array() in
d:/cs/www/koko/home/index.phtml on line 18

irgendein Vorschlag diesbezüglich ;-)
Ich steige durch die Funktion nicht so 100%ig durch, so dass
ich nicht so wirklich sagen kann, was da los ist. Aber
vorweg oder hintenach schon mal vielen Dank!

Berni

Henrik Motakef

unread,
Jan 1, 2001, 2:53:10 PM1/1/01
to
Bernhard Kaiser <au...@topmail.de> wrote:
> Hm...
> Fatal error: Cannot redeclare in_array() in
> d:/cs/www/koko/home/index.phtml on line 18

Ups. Ich hatte übersehen, das in_array() älter ist als array_unique
(ab PHP4.0.0). Das bedeutet einfach, dass man eine Funktion nicht
zweimal definieren darf, also lass mein in_array weg, das hast du
schon.

mfg
Henrik

Bernhard Kaiser

unread,
Jan 1, 2001, 3:59:01 PM1/1/01
to
Henrik Motakef <henrik....@ruhr-uni-bochum.de> schrieb
in im Newsbeitrag: 67nq29...@duke.hmotakef.de...

wenn ich die Funktion in_array() lösche, dann tritt der
selbe Fehler auf, nur eben mit der Funktion array_unique.

Vielleicht noch eine Idee bezüglich dem, was ich ganz am
Anfang gepostet habe?

Bernhard


Henrik Motakef

unread,
Jan 1, 2001, 4:19:31 PM1/1/01
to
Bernhard Kaiser <au...@topmail.de> wrote:
> wenn ich die Funktion in_array() lösche, dann tritt der
> selbe Fehler auf, nur eben mit der Funktion array_unique.

Ich resümiere:

Erste Aussage: array_unique tut, was du willst
-> du musst es wohl ausprobiert haben

Zweite Aussage: du brauchst es auf einem Server, auf dem es
array_unique nicht gibt
-> du benutzt zwei unterschiedliche Server, auf dem einem gibt
es die Funktion array_unique, auf dem anderen nicht

Dritte Aussage: Du bekommst eine Fehlermeldung, dass du array_unique
nicht nochmal definieren darfst

Entweder die Entwickler von PHP haben in der Version 4.0.0 schon mal
den Funktionsnamen array_unique reserviert, weil sie ihn irgendwann
gebrauchen könnten, oder du probierst den Workaround für den alten
Server auf dem neuen aus, wo er weder nötig noch möglich ist.

Da ich mich gerade etwas über die Entwickler geärgert habe, will ich
mal beide Möglichkeiten als gleichberechtigt gelten lassen. Ansonsten
halte ich die erste für nicht sehr wahrscheinlich.

Bernhard Kaiser

unread,
Jan 1, 2001, 5:03:32 PM1/1/01
to
Henrik Motakef <henrik....@ruhr-uni-bochum.de> schrieb
in im Newsbeitrag: 39sq29...@duke.hmotakef.de...

> Bernhard Kaiser <au...@topmail.de> wrote:
> > wenn ich die Funktion in_array() lösche, dann tritt der
> > selbe Fehler auf, nur eben mit der Funktion
array_unique.
>
> Ich resümiere:
>
> Erste Aussage: array_unique tut, was du willst
> -> du musst es wohl ausprobiert haben

genau!

>
> Zweite Aussage: du brauchst es auf einem Server, auf dem
es
> array_unique nicht gibt
> -> du benutzt zwei unterschiedliche Server, auf dem einem
gibt
> es die Funktion array_unique, auf dem anderen
nicht

zwei verschieden Server, exakt

> Dritte Aussage: Du bekommst eine Fehlermeldung, dass du
array_unique
> nicht nochmal definieren darfst

ebenfalls richtig.

>
> Entweder die Entwickler von PHP haben in der Version 4.0.0
schon mal
> den Funktionsnamen array_unique reserviert, weil sie ihn
irgendwann
> gebrauchen könnten, oder du probierst den Workaround für
den alten
> Server auf dem neuen aus, wo er weder nötig noch möglich
ist.
>
> Da ich mich gerade etwas über die Entwickler geärgert
habe, will ich
> mal beide Möglichkeiten als gleichberechtigt gelten
lassen. Ansonsten
> halte ich die erste für nicht sehr wahrscheinlich.
>
> mfg
> Henrik
>
> --
> Quote of the day: '

ok, auf dem Server mit php4.0.0 kommt nun eine andere
Fehlermeldung bei folgendem Skript, ich werde mal etwas
suchen gehen, aber auf jeden Fall kam nicht die alte
Fehlermeldung.

while( ($file = readdir($handle)) != false) {

if ($file != "." && $file != ".." && $file !=
"WS_FTP.LOG" && $file != "stadt.php" && $file != "stadt.x")
{
// Hier ein assoziatives Array generieren
// Indix = Dateiname, Feldwert = Datum der Datei
include ($dir.$file);
$array_file[$file] = $artist;
}
}

function array_unique($array_file)
{
$unique = array();

while (list( $key, $val ) = each( $array )) {
if (!in_array( $val, $unique )) {
$unique[$key] = $val;
}
}

return $unique;
}


Berni


Christian Dickmann

unread,
Jan 1, 2001, 8:18:29 PM1/1/01
to
Moin,

Bitte keine Fullquotes! Danke.

> ok, auf dem Server mit php4.0.0 kommt nun eine andere
> Fehlermeldung bei folgendem Skript, ich werde mal etwas
> suchen gehen, aber auf jeden Fall kam nicht die alte
> Fehlermeldung.

welche Meldung kam? Fehlermeldungen sind eine Wunderbare
erfindung. Sie sagen einem meist genau, was man falsch gemacht
hat (Windows Meldungen u.ä. ausgenommen).
Also: Nenn uns bitte die Fehlermeldung. und gib auch bitte an welche
zeile PHP nun meint. (also: nicht die nummer sondern den Inhalt, oder
im Quellcode einen Kommentar reinmachen oder so)


> while( ($file = readdir($handle)) != false) {
> if ($file != "." && $file != ".." && $file !=
> "WS_FTP.LOG" && $file != "stadt.php" && $file != "stadt.x")
> {
> // Hier ein assoziatives Array generieren
> // Indix = Dateiname, Feldwert = Datum der Datei
> include ($dir.$file);
> $array_file[$file] = $artist;
> }
> }

sieht OK aus.

> function array_unique($array_file) // Hier solltest du $array verwenden,
denn
> // das tust du auch in
der Funktion.


> {
> $unique = array();
>
> while (list( $key, $val ) = each( $array )) {
> if (!in_array( $val, $unique )) {
> $unique[$key] = $val;
> }
> }
>
> return $unique;
> }

mmh. rufst du funktion überhaupt auf?
also per
$array_file=array_unique($array_file);
???

siehe auch funktions definition im quellcode.

Wie lautet die Fehlermeldung?

Christian Dickmann


Bernhard Kaiser

unread,
Jan 2, 2001, 8:33:09 AM1/2/01
to
Christian Dickmann <chris...@gmx.de> schrieb in im
Newsbeitrag: 92raa3$hh7$07$1...@news.t-online.com...

> Moin,
>
> Bitte keine Fullquotes! Danke.
>
> > ok, auf dem Server mit php4.0.0 kommt nun eine andere
> > Fehlermeldung bei folgendem Skript, ich werde mal etwas
> > suchen gehen, aber auf jeden Fall kam nicht die alte
> > Fehlermeldung.
>
> welche Meldung kam? Fehlermeldungen sind eine Wunderbare
> erfindung. Sie sagen einem meist genau, was man falsch
gemacht
> hat (Windows Meldungen u.ä. ausgenommen).

Morgen erst mal auch von mir!
Also folgende Fehlermeldung war es:

Warning: Variable passed to each() is not an array or object
in /www/www.koko.de/html/preview/home/index.phtml on line 15
(siehe zweiten Auszug und Kommentar weiter unten)

> > while( ($file = readdir($handle)) != false) {
> > if ($file != "." && $file != ".." && $file !=
> > "WS_FTP.LOG" && $file != "stadt.php" && $file !=
"stadt.x")
> > {
> > // Hier ein assoziatives Array generieren
> > // Indix = Dateiname, Feldwert = Datum der Datei
> > include ($dir.$file);
> > $array_file[$file] = $artist;
> > }
> > }
>
> sieht OK aus.
>
> > function array_unique($array_file) // Hier solltest du
$array verwenden,
> denn
> > //
das tust du auch in
> der Funktion.

Funktioniert aber trotzdem nicht, nach Veränderung kommt bei
mir aber auch keine andere Fehlermeldung, bzw. keine
Fehlermeldung, eben erst die drei Zeilen später.

> > {
> > $unique = array();
> >
> > while (list( $key, $val ) = each( $array )) { // <-
DIESE ZEILE betrifft die Fehlermeldung


> > if (!in_array( $val, $unique )) {
> > $unique[$key] = $val;
> > }
> > }
> >
> > return $unique;
> > }
>
> mmh. rufst du funktion überhaupt auf?
> also per
> $array_file=array_unique($array_file);
> ???

In der Tat nicht, aber wenn ich sie aufrufe, hat er immer
nur vorige Fehlermeldung, bricht er evtl ab?

>
> siehe auch funktions definition im quellcode.
>
> Wie lautet die Fehlermeldung?
>
> Christian Dickmann

Bernhard


0 new messages