PHP Variable mit Array vergleichen, wenn Treffer dann Treffer ausgeben!

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Folgendes ....

PHP:
<?php
 
$base = array('UB40','Jimmy Cliff');
 
//hier steht in der ersten Zeile alle 3 Minuten ein neuer Künstler Name!
$text = file("aktuell.txt");
$aktuell = $text[0];
 
//hier möchte ich prüfen ob der Künstler aus der ersten Zeile im
//Array vorhanden ist.
if(in_array($aktuell[0],$base)) {
 
//hier komme ich nicht weiter..
//Die Variable NOW soll jetzt mit dem Treffer gefüllt werden,
//vorher aber den String kastrieren, also alle Buchstaben klein,
//sowie leerzeichen weg und noch ein .jpg dran hängen...
 
$now = 
 
else {
$now = "default.jpg";
}
 
// Und auf der Seite setze ich dann in ein <img ....$string> also...
 
<img ..... <?php echo $now; ?>../ >
 
//damit würde dann immer das aktuelle Bild angezeigt!
// Hilfe benötige ich also oben bei $now
?>
 
Erstens: Afaik erzeugt file() nur ein eindimensionales Array, indem jede Zeile für einen Eintrag steht. $text[0] liefert also schon die erste Zeile, aber nicht mehr als Array, d.h. du brauchst nicht erneut $aktuell[0], da es sich bei $aktuell um kein Array mehr handelt (nur für den Fall, das an dieser Stelle Fehler auftreten. Ansonsten kann man arrays auch immer schön mit var_dump überprüfen)

Zweitens: $now = strotolower(trim($aktuell)).'jpg'; ?
Oder falls Leerzeichen im Text stehen,

$now = str_replace(' ', '', $now);


so long
 
Wenn der Wert $aktuell im Array $base steht, dann ist $now = $aktuell.

Mit strtolower bekommst du alles in Kleinbuchstaben und trim entfernt Leerzeichen vor und nach dem String.

Und das .jpg bekommst du mit $now .= ".jpg"; hinten dran.
 
Hi

Thanks, das .jpg kann ich eigentlich auch schon im HTML Code schreiben und halt nur das $now vorsetzen...oder ist das nicht gut?
 
Spielt keine Rolle.

Wenn's mehr Text wäre, wäre es aber Unsinn diesen mit in die Variable zu schreiben.
 
Zuletzt bearbeitet:
Hm.. klappt nicht, es wird immer default ausgegeben!

PHP:
<?php
    $base = array('UB40','Jimmy Cliff');
 
    $text       = file("aktuell.txt");
    $aktuell   = $text[0];
 
    if(in_array($aktuell,$base)) {
 
    $now = $aktuell;
    }
    else {
    $now = "default";
 
    }
?>
 
Hast du dir mal $aktuell ausgeben lassen (und wenn nicht das drin steht, was du willst, lass dir $text[0] ausgeben)? Dann siehst du ja was drin steht und wo der Fehler demnach liegen muss.
 
Zuletzt bearbeitet:
Ja klar, $aktuell hat Jimmy Cliff und auch $text[0]

EDIT
$now ist leer
 
Zuletzt bearbeitet:
Immer soweit vereinfch, wie es geht.

Schreib statt if(in_array($aktuell,$base)) testweise if(in_array("Jimmy Cliff",$base)) . Wenn das klappt, liegt der Fehler in $aktuell. Wenn nicht, dann liegts wohl am Array.

Evtl. hast du ja doch noch irgendwo Leerzeichen die stören.
 
Ich habs bzw. mit UB40 klappt es aber nicht mit Jimmy Cliff, also hat es was mit der Leerstelle im Namen zutun.

Es wird Jimmy Cliff aus der Text nicht im Array wo auch Jimmy Cliff drin steht gefunden! entferne ich Cliff aus der Text und aus dem Array gehts!

EDIT: ich glaube ich weiß woran es liegt...ich teste

EDIT: erledigt, Textdatei welche ich offline abgespeichert habe war mit BOM, immer wieder der selbe Mist mit Notepad, vertehe nicht das PHP darauf reagiert, oder liegt das an den Einstellungen vom Hoster? vergesse diese Sache ewig aber heute ist Schluss ich muss mir einen anderen Editor besorgen.


Edit:
Noch eine Frage zu der Sache!

Ist es nicht besser die ganzen Küstlername auch in eine Textdatei zu packen als ins Array? und dann halt schauen ob es den aktuelln string in dieser Textdatei gibt. Was ginge von der Verarbeitung schneller? was wäre besser?

Edit:
So, das Problem war dann aber auch noch, gibt es mehr als 1 Zeile in der Textdatei hat das nicht mehr funktioniert. Um sicher zugehen muss "trim" vor der Abfrage gesetzt werden, dann klappt es immer.


PHP:
<?php 
 
    $base = array(UB40','Jimmy Cliff');
 
    $file      = file('aktuell.txt');
    $aktuell   = $file[0];
//muss hier schon rein sonst klappt es nicht wenn die Textdatei mehr als 1 Zeile hat!
    $aktuell   = trim($aktuell);
 
    if(in_array($aktuell,$base)) {
 
    $now = strtolower($aktuell).'.jpg';
    $now = str_replace(' ','', $now);
    }
    else {
    $now = "no_image.png";
    }
?>

Edit die letzte...

Wie könnte ich das jetzt auslagern? also alle Wörter in eine Textdatei schreiben und dann in diese Textdatei schauen od es den String aus $aktuell gibt?
 
Zuletzt bearbeitet:
Ehrliche Antwort?

Code:
CREATE TABLE Artist (
  artist_id INTEGER NOT NULL,
  artist_name VARCHAR(255)
)

INSERT INTO Artists (artist_name) VALUES ('UB40') ....

"SELECT * FROM Artist WHERE artist_name = '".$aktuell."'

Wenn es denn unbedingt über Files sein muss, kannst du auch ganz normal eine Textdatei erstellen und in jede Zeile den Artist schreiben. Dann wie gehabt mit File einlesen und schon hast du ein eindimensionales Array für deine in_array Abfrage
 
Jao, habs jetzt so gemacht über Textdatei..

PHP:
<?php 
 
    $temp      = file('titles.txt');
    $aktuell   = $temp[0];
    $aktuell   = trim($aktuell);
    $base = file('base.txt'); 
 
     for($i=0; $i<count($base); $i++) { 
     
     if (ereg($aktuell, $base[$i])) { 
     
     $now = strtolower($aktuell).'.jpg';
     $now = str_replace(' ','', $now);
    } 
     else {
     
     $now = "no_image.png";
    }
   }
    
?>

Funktioniert soweit gut nur ist hier jetzt die Frage, wie funktioniert es wenn da mal 3000 Zeilen drin sind. Naja ich probier es einfach und wenn das wirklich zuuu lange dauern sollte werde ich es über eine DB machen, aber erst einmal testen.
 
"ereg" solltest du nicht benutzen, das ist veraltet. "preg_match" wäre die alternative.

Allerdings würde ich es für sinnvoller halten, gleich ein assoziatives Array aufzubauen, dass du via
Code:
$base[strtolower(trim($temp[0]))]
direkt an die zugehörige Bilddatei gelangst.

dann würde sich das "raussuchen" des passenden bildes etwa so gestalten:
Code:
$aktuell = trim(files('aktuell.txt')[0]);
$base = file('base.txt');
$now = 'no_image.png';
$imapes = array();
foreach($base as $elem)
{
  $elem = explode('=',$elem);
  $images[strtolower($elem)]=$elem[1];
}
if(isset( $images[strtolower($aktuell)]))
{
  $now = $images[strtolower($aktuell)];
}

Ich hege übrigens die Befürchtung, als könnte man dein Script von eben durch
Code:
$aktuell = trim(files('aktuell.txt')[0]);
if(in_array($aktuell,file('base.txt')))
{
  $now = str_replace(' ','',strtolower($aktuell).'.jpg');
}
ersetzen kann.

Ist aber so nicht getestet ;-)
 
:)
Jetzt blicke ich garnicht mehr durch, bezieht sich das jetzt alles auf das letzte Script oder auch auf das erste ganz oben? dein Code in der Mitte wäre dann das eigentliche Script? das ist alles? da fehlt aber noch was oder?

Auch verstehe ich nicht ganz wie jetzt festfestellt wird ob sich der String in $aktuell in der $base befindet, kein "preg_match" ? braucht man das dann doch nicht?
Ergänzung ()

Habs jetzt mal getestet, also das funktioniert nicht auch mein Script oben drüber funktioniert nicht, es funktioniert nur wenn die LETZTE Zeile passt, also wenn sich der String aus der $aktuell in der letzten Zeile der $base befindet wird das richtige Bild gezeigt wenn nicht dann wird "kein Bild" angezeigt. Jemand eine Idee warum?

Richtig funktioniert nur das oben erste Script mit dem Array und direkten Eintragung der Wörter, warum nicht mit externer Textdatei?
Ergänzung ()

-=Renegade=- schrieb:
Ehrliche Antwort?


Wenn es denn unbedingt über Files sein muss, kannst du auch ganz normal eine Textdatei erstellen und in jede Zeile den Artist schreiben. Dann wie gehabt mit File einlesen und schon hast du ein eindimensionales Array für deine in_array Abfrage

Hab ich, geht aber nicht es wird immer "no_image.png" angezeigt.

PHP:
<?php 
 
    $base = file('base.txt');
 
    $temp      = file('aktuell.txt');
    $aktuell   = $temp[0];
    $aktuell   = trim($aktuell);
 
    if(in_array($aktuell,$base)) {
 
    $now = strtolower($aktuell).'.jpg';
    $now = str_replace(' ','', $now);
    }
    else {
    $now = "no_image.png";
    }
?>
Ergänzung ()

Habs, die Textdatei in der die Wörter einegtragen sind, nach dem letzten Wort muss man ein Umbruch
reinmachen. Das kann doch alles nicht wahr sein, warum denn jetzt das?
 
Zuletzt bearbeitet:
Es liegt an der base-Textdatei.

Dort hast du auf Grund von Zeilenumbrüchen auch immer Whitespaces (\n oder \r o.ä.); je nach Editor.


D.h. du müsstest dein $base-Array nochmal vorab behandeln, um die Whitespaces zu entfernen.

Bspw. mit
PHP:
$base = file('base.txt');

foreach($base as $zeile)
{
  $zeilen[] = trim($zeile);
}
Und $zeilen benutzt du dann weiter unten für in_array($aktuell, $zeilen).


Siehe dazu hier unter dem Punkt Rückgabewerte.
 
Hi

Das funktioniert nicht, das hatte ich auch schon gemacht, es funktioniert nur so:

PHP:
<?php 
    //hier sind die ganzen Künstlername eingetragen.
    $base = file('discobase.txt');
   //hier ist der aktuelle Titel, dieser soll in der $base gesucht werden
  //wenn er gefunden wurde soll das passende Bild ausgegeben werden.
    $temp = file('aktuell.txt');
    $aktuell = $temp[0];
 
    if(in_array($aktuell,$base)) {
 
    $now = strtolower($aktuell).'.jpg';
    $now = str_replace(' ','', $now);
    }
    else {
    $now = "no_image.png";
    }
?

Aber auch nur dann wenn ich nach dem letzten Wort in der Textdatei ein Umbruch einfüge, also ---> letztes Wort (enter taste)
Und das verstehe ich nicht, warum wird nach dem letzten Wort ein Umbruch also neue leere Zeile benötigt? mit dem "foreach" geht keine Variante, egal ob es einen Umbruch nach dem letzten Wort gibt oder nicht.
 
Hängt auch vom Editor ab, welche Whitespaces am Zeilenende entstehen.

Das einfachste wäre es, auf eine Datenbank umzusteigen :D

KA ob man das mit Textdateien einfacher lösen kann; mein geposteter Code funktioniert bei mir jedenfalls - evtl. weil mein Texteditor die Datei anders abspeichert als deiner.
 
Also ich speicher den Text als DOS/Utf-8 ab, wie sonst soll ich den abspeichern?
die Umbrüche sind \n <--- diese.

Ich mein ich kann jetzt auch damit leben und halt in der $base nach dem letzten Wort immer
ein Umbruch machen aber richtig kann es doch nicht sein das alles davon anhängt ob das Script richtig funktioniert.
 
Man kann das ganze auch unabhängig vom Editor gestalten. Einfach den Flag FILE_IGNORE_NEW_LINES setzen. Es macht durchaus auch immer Sinn, die Referenz zum jeweiligen Befehl zu lesen :)


so long
 
Klar wenn es auch funktionieren würde, tut es aber nicht, auch hatte ich das schon ausprobiert, ich will hier doch jetzt nicht alles niederschreiben was ich schon alles probiert habe.

Und du kannst mir glauben, ich studiere die Referenz zu jedem Befehl und probiere aus, nur wenn etwas garnicht geht dann frage ich und hier ist es so das der obige Code nur funktioniert wenn in der Textdatei wo sich die Künstlernamen Zeile für Zeile befinden, ich nach dem letzen Küstlername einen Umbruch reinmachen muss. Wenn es keinen Umbruch gibt dann funktioniert der Code nicht bzw. doch nur wird nicht das Bild angezeigt.

Ich denke ich weiß auch warum nicht, wenn ich 10 Namen untereinander habe gibt es nach jedem Namen ein \n
nur beim letzten nicht weil es ja danach keine neue Zeile gibt und da liegt wahrscheinlich der Hund begraben, erst wenn ich nach dem letzten Eintrag eine neue Zeile einleite entsteht auch da ein \n udn schon funktioniert es.
 
Zuletzt bearbeitet:
Zurück
Oben