Problem mit Array und Vergleich

PhoenixDH

Erfahrenes Mitglied
Ich habe folgendes Problem:

Ich habe eine Textdatei in der Daten folgendermaßen stehen:
Code:
2009August1
2009August2
2009August3
2009August4
2009August5
2009August6
2009August7

Unschwer zu erkennen, es handelt sich um Termine.

Dann habe ich einen Part Code der mir die Datei einliest und eine Funktion die zum Prüfen der Werte dienen soll:
Code:
$thisFileContent = file("belegungen.txt");

function checkarrayaufwert($wert,$array)
{
$ret=false;
for ($i=0;$i < count($array);$i++)
 {
 if ($wert==$array[$i])
  {
  $ret=true;
  }
 }
return $ret;
}

Was ich jetzt machen will:
Ich baue einen Kalender, und wenn ein Datum kommt das in der Liste steht, dann soll der eintrag andersfarbig dargestellt werden.

Dazu verwende ich folgenden Code:
Code:
        for ($j=0; $j<$x; $j++)
	{

	  //Eindeutige ID für Zelle
          $id = $ye.$monat.$day++;

	  if (checkarrayaufwert($id,$thisFileContent))
	  {
          echo "<td id=".$id." width=\"15\" align=\"right\" class=\"cal_belegt\">".$tag++."</td>";
	  }
	  else
	  {
          echo "<td id=".$id." width=\"15\" align=\"right\" class=\"cal_td\">".$tag++."</td>";
	  }

        }

Jetzt das Problem:
Es wird immer nur das letzte Datum aus der Textdatei andersfarbig markiert.

Kann mir jemand sagen woran das liegt?

Dank euch!
 
Also zunächst was zur Struktur und zum Algorithmus:
PHP:
for ($i=0;$i < count($array);$i++)
 {
 if ($wert==$array[$i])
  {
  $ret=true;
  }
 }

Diese Schleife läuft immer count($array) oft mal durch, da die Wiedergabe nur in einer Variablen gespeichert wird und trotzdem weiter gesucht wird. Die folgende Schleife läuft maximal count($array) durch, da sie bei erster Übereinstimmung abbricht:
PHP:
for ($i=0;$i < count($array);$i++)
 {
 if ($wert==$array[$i])
  {
  return true;
  }
 }



Vermeide dynamische Bedingungen.
Code:
$i < count($array)
Mit jedem Durchlauf wird count() ausgeführt, was enorm Performance frisst: http://phpperformance.de/zaehlschleife-so-oft-durchfuehren-wie-ein-array-eintraege-hat/
Daher definiere so oft wie Möglich vorher eine Variable:
PHP:
$max = count($array);
for ($i=0;$i < $max;$i++)
 {
 if ($wert==$array[$i])
  {
  return true;
  }
 }

Dein Code erfüllt die Anforderungen an einen minimalen Code aber manchmal kann man es auch zu weit treiben. Nie so lang an der Schraube drehen bis sie bricht.

Und wenn man sich jetzt so den Code anguckt entspricht das genau der in PHP schon vorhandenen Funktion in_array().
 
Dank dir für die schnelle Antowrt, das mit in_array() habe ich auch schon getestet, aber da habe ich den selben Effekt!

Code:
        for ($j=0; $j<$x; $j++)
	{

	  //Eindeutige ID für Zelle
          $id = $ye.$monat.$day++;

	  if (in_array($id,$thisFileContent))
	  {
          echo "<td id=".$id." width=\"15\" align=\"center\" class=\"cal_belegt\">".$tag++."</td>";
	  }
	  else
	  {
          echo "<td id=".$id." width=\"15\" align=\"center\" class=\"cal_td\">".$tag++."</td>";
	  }

        }

Es wird immer nur der letzte Wert aus der TXT Datei andersfarbig markiert!
 
Zur Fehlersuche zwischen $id und der Kontrolle folgendes hinzufügen:
PHP:
var_dump($id, $x, in_array($id,$thisFileContent));
Und die Ausgabe hier angeben.

Wofür ist überhaupt die Schleife, wenn $j innerhalb nicht verwendet wird?
 
j ist für das zählen der Tage!

Die Ausgabe lautet:
string(11) "2009August7" int(31) bool(true)

Aber nur für den einen letzten Wert in dem Array oder der Textdatei, für alle anderen:
string(11) "2009Januar1" int(31) bool(false)
 
Was ist denn hier los?
Vor die Schleife einmal:
PHP:
var_dump($thisFileContent, $tag);
Und ruhig die komplette Ausgabe (letzten 10 Zeilen dieser Ausgabe gehen auch).

btw: Warum gibt es einen Zähler $day und einen $tag? Sieht doppelt aus.
 
Zuletzt bearbeitet:
Die Variablen hab ich schon etwas angepasst, bin gerade am überarbeiten des Scriptes. Hab den Code aus nem anderen Script genommen!

Hier hie Ausgabe nun:
Code:
array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1) array(7) { [0]=>  string(12) "2009August1 " [1]=>  string(12) "2009August2 " [2]=>  string(12) "2009August3 " [3]=>  string(12) "2009August4 " [4]=>  string(12) "2009August5 " [5]=>  string(12) "2009August6 " [6]=>  string(11) "2009August7" } int(1)

Nen Unterschied en ich sehe ist: string(12) bei denen die net angezeigt werden und string(11) bei dem dem es geht!

Das ganze kommt 12 mal da ich ja noch in ner anderen Schleife für die Monate drin bin!

----------------

Hab jetzt herausgefunden das es bei dem String um die Länge geht, aber die sollte doch normal gleich sein, denn es gibt in den Zeilen keine Leerzeichen!
 
Zuletzt bearbeitet:
Hast den Fehler doch jetzt gefunden ^^
An jedem Zeilenende ist ein Leerzeichen oder ähnliches außer bei dem letzten. Das heißt du müsstest $id dementsprechend anpassen.
Es geht auch etwas mit file_get_contents() und strpos():
PHP:
$foo = file_get_contents("foo.txt");

$x = 31;
$y = "2009";
$monat = "August";

for ($i=0; $i<$x; $i++)
{
	$id = $y . $monat . $day++;
	if (strpos($foo, $id) !== false)
	{
		// drin
	}
	else
	{
		// nicht dabei
	}
}
 
Zuletzt bearbeitet:
Danke, klappt soweit, jetzt habe ich nur das Problem das ich bei z.B. 2009August17

den 1 und den 17 August markiert bekomme!

Das müsste ich noch weg bekommen dann bin ich glücklich!

So, habs:

Code:
        for ($tag=1; $tag<=$x; $tag++)
	{

	  if ($tag < 10)
	  {
          $tag = "0".$tag;
	  }

	  //Eindeutige ID für Zelle
          $id = $tag."-".$monat."-".$ye;

	  if (strpos($thisFileContent, $id) != false)
	  {
          echo "<td width=\"15\" align=\"center\" class=\"cal_belegt\">".$tag."</td>";
	  }
	  else
	  {
          echo "<td width=\"15\" align=\"center\" class=\"cal_td\">".$tag."</td>";
	  }

        }
 
Zuletzt bearbeitet:
Hi,

Danke, klappt soweit, jetzt habe ich nur das Problem das ich bei z.B. 2009August17

den 1 und den 17 August markiert bekomme!

deshalb ist diese Variante auch nicht die beste Wahl. Lies die Datei wieder mit file() ein und entferne danach die Zeilenumbrüche aus den Array-Elementen:

PHP:
$thisFileContent = array_map('trim', $thisFileContent);

LG
 
Zurück