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
Meinst du sowas wie array_unique()?
hth
Henrik
--
Quote of the day: '
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
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 ;-)
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
> 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
(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;
}
}
}
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)
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
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
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
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.
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
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
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