Notice:
KD-one
- php
Hallo alle,
Ich experimentiere grad mal ein wenig mit diversen Dingen in PHP rum, und dabei ist mir aufgefallen, daß bei verschiedenen Sachen "Notices" ausgegeben werden.
Bsp:
<?php
Error_Reporting(E_ALL);
$string = "includes/css/test.txt";
$result = explode(".",$string);
print_r(array_values ($result));//liefert: Array ( [0] => includes/css/test [1] => txt )
parse_str($result); //liefert: Notice: Array to string conversion in /home/dunzinger/www/united-web/faq/_test/test.php on line 6
echo $result[0]."<br>\n"; //liefert: includes/css/test<br>
echo $result[1]; //liefert: txt
?>
Was bedeutet die Notiz? Ist das eine zweifelhafte Methode oder was sagt diese Angabe aus?
Gruß
Kurt
Hallo Kurt,
$string = "includes/css/test.txt";
was steht in der Datei drin?
$result = explode(".",$string);
print_r(array_values ($result));//liefert: Array ( [0] => includes/css/test [1] => txt )
parse_str($result); //liefert: Notice: Array to string conversion in /home/dunzinger/www/united-web/faq/_test/test.php on line 6
parse_str erwartet als ersten Parameter einen String (->http://de3.php.net/parse_str), und keinen Array. php ist so freundlich dir den Array zu einem String umzuwandeln - und dies teilt dir php in form einer "Notice" mit (die aber nicht immer ausgegeben wird - aber da bei dir error_reporting auf E_ALL steht wird sie ausgegeben).
echo $result[0]."<br>\n"; //liefert: includes/css/test<br>
echo $result[1]; //liefert: txt
das sind die zwei Arrayelemente die du mit dem explode "erzeugt" hast. Was willst du denn eigentlich machen?
Grüße aus Nürnberg
Tobias
Hallo Tobias,
$string = "includes/css/test.txt";
was steht in der Datei drin?
im Prinzip gar nichts. Das ist lediglich eine Testannahme, mit der ich einfach ein wenig zum Lernen rumexperimentiere.
Im Endeffekt möchte ich ein paar Scripte realisieren, die aus einem Array feststehende Werte auslesen und dann für die jeweiligen Anforderungen umwandeln.
Zur Zeit aber experimentiere ich einfach etwas rum, um die logischen Zusammenhänge besser zu begreifen und darauf basierend ein Konzept entwickeln zu können, wie ich meine Intention verwirklichen könnte.
Das Beispielscript ist nur eine Spielerei. :-)
$result = explode(".",$string);
print_r(array_values ($result));//liefert: Array ( [0] => includes/css/test [1] => txt )
parse_str($result); //liefert: Notice: Array to string conversion in /home/dunzinger/www/united-web/faq/_test/test.php on line 6
parse_str erwartet als ersten Parameter einen String (->http://de3.php.net/parse_str), und keinen Array. php ist so freundlich dir den Array zu einem String umzuwandeln - und dies teilt dir php in form einer "Notice" mit (die aber nicht immer ausgegeben wird - aber da bei dir error_reporting auf E_ALL steht wird sie ausgegeben).
Klar, also habe ich da mit einer unzulässigen Anweisung gearbeitet, daher die notiz. :-)
Das ist das Schwierige daran, daß ich die Erklärungen zu den einzelnen Sachen oft nicht wirklich "übersetzen" kann, weshalb ich das dann einfach ausprobiere und schaue, was dabei rauskommt. :-)
(die aber nicht immer ausgegeben wird - aber da bei dir error_reporting auf E_ALL steht wird sie ausgegeben)
Das ist Absicht, ich will ja wissen, was da geschieht.
echo $result[0]."<br>\n"; //liefert: includes/css/test<br>
echo $result[1]; //liefert: txt
das sind die zwei Arrayelemente die du mit dem explode "erzeugt" hast. Was willst du denn eigentlich machen?
Letztendlich stelle ich mir das so vor, daß der Pfad "includes/css/test.txt" aus dem Array ausgelesen wird, die slashes durch andere Zeichen ersetzt werden(»), die Fileangabe entfernt wird und durch den Seitentitel ersetzt wird. Daraus soll eine breadcrump-Navigation entstehen. (Startseite » CSS » irgendeinSeitentitel)
Da ich mit der Syntax von PHP so gut wie gar nicht vertraut bin, experimentiere ich zur Zeit einfach nur rum und probiere aus, was mir anwendbar erscheint. :-)
Dabei ist dann auch der Fehler aufgetaucht.
Gruß
Kurt
Hallo Kurt,
$string = "includes/css/test.txt";
was steht in der Datei drin?
im Prinzip gar nichts.
ich Dödel - das ist ja auch vollkommen egal was in der Datei steht - es geht ja lediglich um den String und nicht um den Dateiinhalt ... :-)
(die aber nicht immer ausgegeben wird - aber da bei dir error_reporting auf E_ALL steht wird sie ausgegeben)
Das ist Absicht, ich will ja wissen, was da geschieht.
das ist schon ok so - mit error_reporting(E_ALL) sollte man ja auch testen.
Letztendlich stelle ich mir das so vor, daß der Pfad "includes/css/test.txt" aus dem Array ausgelesen wird,
list($pfad,$endung) = explode('.','includes/css/test.txt');
die slashes durch andere Zeichen ersetzt werden(»),
$pfad = str_replace('/',' » ',$pfad);
die Fileangabe entfernt wird
unset($endung); //;-)
und durch den Seitentitel ersetzt wird.
echo '<title>'.$pfad.'</title>';
Daraus soll eine breadcrump-Navigation entstehen. (Startseite » CSS » irgendeinSeitentitel)
so? (s.o.) ;-)
Da ich mit der Syntax von PHP so gut wie gar nicht vertraut bin, experimentiere ich zur Zeit einfach nur rum und probiere aus, was mir anwendbar erscheint. :-)
dann probier mal schön weiter - und bei Problemen frag einfach nach :-)
Grüße aus Nürnberg
Tobias
Hallo Tobias,
Letztendlich stelle ich mir das so vor, daß der Pfad "includes/css/test.txt" aus dem Array ausgelesen wird,
list($pfad,$endung) = explode('.','includes/css/test.txt');die slashes durch andere Zeichen ersetzt werden(»),
$pfad = str_replace('/',' » ',$pfad);die Fileangabe entfernt wird
unset($endung); //;-)und durch den Seitentitel ersetzt wird.
echo '<title>'.$pfad.'</title>';Daraus soll eine breadcrump-Navigation entstehen. (Startseite » CSS » irgendeinSeitentitel)
so? (s.o.) ;-)
Cool, das funktioniert ja wirklich! So auf die Art wollte ich das haben. Von "list" hab ich noch gar nix mitgekriegt, wieder ein Denkansatz. :-)
Im Grunde ist das ja nur ein kleiner Teil, aber darauf kann man ja schon mal aufbauen und weiterdenken. ;-)
Im Grunde sollen alle Inhalte der Seite, die sich ändern, aus einem, maximal aus zwei Arrays erzeugt werden.
Seitentitel, Metatags, Breadcrump-Navigation, Überschriften und wenn's ganz gut geht, auch die Menüs.
Zur Zeit setze ich ja bis zu 4 Menüs ein, wäre schon sinnvoll, wenn nur eines zu ändern wäre und alle anderen wachsen mit. :-)
Aber das bedeutet noch vieeel lernen... *g*
Da ich mit der Syntax von PHP so gut wie gar nicht vertraut bin, experimentiere ich zur Zeit einfach nur rum und probiere aus, was mir anwendbar erscheint. :-)
dann probier mal schön weiter - und bei Problemen frag einfach nach :-)
Mach ich doch glatt! <-- Das ist eine Drohung! *g*
Gruß
Kurt
Hello,
Hallo Kurt,
$string = "includes/css/test.txt";
was steht in der Datei drin?
DU bist aber neugierig!
*scnr*
Liebe Grüße aus http://www.braunschweig.de
Tom
hi,
$result = explode(".",$string);
explode trennt $string an all den stellen auf, wo dieser einen punkt enthält. da, je nach anzahl der punkte, höchstwahrscheinlich mehrere teils-strings herauskommen, ist der rückgabewert von explode() _immer_ vom typ array.
parse_str($result); //liefert: Notice: Array to string conversion in /home/dunzinger/www/united-web/faq/_test/test.php on line 6
Was bedeutet die Notiz? Ist das eine zweifelhafte Methode oder was sagt diese Angabe aus?
die notice sagt aus, dass du hier eine php-funktion unsauber anwendest.
parse_str() erwartet, wie der name schon nahe legt, als ersten parameter einen string - du fütterst die funktion jedoch mit einem array (eben dem, welches du ja kurz zuvor mit explode() erzeugt hast).
wegen dieser "unsauberkeit" gibt php dir also eine notice aus. zwar kann php in solchen fällen den "fehler" meistens selbständig elimieren (was es ja hier auch macht, eine "Array to string conversion" eben) - aber darauf verlassen solltest du dich nicht, insbesondere, wenn du _sauber_ programmieren willst.
gruss,
wahsaga
Hallo wahsaga,
$result = explode(".",$string);
explode trennt $string an all den stellen auf, wo dieser einen punkt enthält. da, je nach anzahl der punkte, höchstwahrscheinlich mehrere teils-strings herauskommen, ist der rückgabewert von explode() _immer_ vom typ array.
Ja, soweit so klar. Wie aber kann ich einen Teil, z.B. $result[0], wieder in einen String umwandeln? Den abgetrennten Teil ($result[1]) brauch ich ja dann nicht mehr für die Weiterbearbeitung.
die notice sagt aus, dass du hier eine php-funktion unsauber anwendest.
parse_str() erwartet, wie der name schon nahe legt, als ersten parameter einen string - du fütterst die funktion jedoch mit einem array (eben dem, welches du ja kurz zuvor mit explode() erzeugt hast).
wegen dieser "unsauberkeit" gibt php dir also eine notice aus. zwar kann php in solchen fällen den "fehler" meistens selbständig elimieren (was es ja hier auch macht, eine "Array to string conversion" eben) - aber darauf verlassen solltest du dich nicht, insbesondere, wenn du _sauber_ programmieren willst.
Will ich, aber zwischen wollen und können ist zur Zeit noch ein himmelweiter Unterschied. *g*
Gruß
Kurt
Ja, soweit so klar. Wie aber kann ich einen Teil, z.B. $result[0], wieder in einen String umwandeln?
Der Inhalt eines Feld besteht grundsätzlich, in allen Programmiersprachen, aus Werten beliebiger Typen. In den meisten Sprachen ist ein Feld durchgängig auf einen Typ beschränkt, enthält also beispielsweise nur Zahlen, in PHP kann ein Feld Werte unterschiedlicher Typen enthalten, zum Beispiel Zahlen und Texte.
Was sagt uns das? $result[0] ist bereits ein Text, da brauchst Du nichts umzuwandeln. Willst Du das Feld los werden, weise den Inhalt von $result[0] einer Variable zu, am einfachsten $result selbst:
$result = $result[0];
Damit wäre $result ein Text, und zwar mit dem Inhalt, der vorher in $result[0] stand.
Gruß,
soenk.e
Hallo Sönke,
Der Inhalt eines Feld besteht grundsätzlich, in allen Programmiersprachen, aus Werten beliebiger Typen. In den meisten Sprachen ist ein Feld durchgängig auf einen Typ beschränkt, enthält also beispielsweise nur Zahlen, in PHP kann ein Feld Werte unterschiedlicher Typen enthalten, zum Beispiel Zahlen und Texte.
Was sagt uns das? $result[0] ist bereits ein Text, da brauchst Du nichts umzuwandeln. Willst Du das Feld los werden, weise den Inhalt von $result[0] einer Variable zu, am einfachsten $result selbst:
$result = $result[0];
Damit wäre $result ein Text, und zwar mit dem Inhalt, der vorher in $result[0] stand.
Schön, ein weiterer Denkansatz, der mir sicherlich weiterhelfen wird.
In diesem Fall bliebe aber das Feld weiter existent und ansprechbar, nur ist dann der Wert_auch_ in $result gespeichert, oder wird das Feld durch die Zuweisung gelöscht?
Gruß
Kurt
Hallo KD-one,
Damit wäre $result ein Text, und zwar mit dem Inhalt, der vorher in $result[0] stand.
Schön, ein weiterer Denkansatz, der mir sicherlich weiterhelfen wird.
In diesem Fall bliebe aber das Feld weiter existent und ansprechbar, nur ist dann der Wert_auch_ in $result gespeichert, oder wird das Feld durch die Zuweisung gelöscht?
Blödsinn, eine selbstbeantwortende Frage, nachdem ich ja die Variable überschreibe, kann das Array ja nicht existent bleiben.
Wenn ich einen anderen Variablennamen wählen würde, aber schon?
Gruß
Kurt
Hallo alle,
Ich hab mal was zusammengebastelt:
<?php
Error_Reporting(E_ALL);
$link = "Startseite";
$title = "Das ist ein Seitentitel"; //wird später aus Array ausgelesen.
$string ="includes/javascript/popups/irgendwas.txt"; //wird später aus Array ausgelesen.
$intermediate = explode("/",$string);
$count = 0;
foreach($intermediate as $elem)
{
$count++;
}
switch($count)
{
case 2:
$temp = $intermediate[0];
$file = $intermediate[1];
break;
case 3:
$temp = $intermediate[0];
$path = $intermediate[1];
$file = $intermediate[2];
break;
case 4:
$temp = $intermediate[0];
$path = $intermediate[1];
$subpath = $intermediate[2];
$file = $intermediate[3];
break;
}
$link = strtoupper($link);
if ($count>=3)
{
$path = strtoupper($path);
}
if ($count==4)
{
$subpath = strtoupper($subpath);
}
$temp = str_replace($temp,' <a href="index.php">'.$link.'</a> ',$temp);
$file = str_replace($file,$title,$file);
switch($count)
{
case 2:
echo $temp." » ".$file;
break;
case 3:
echo $temp." » ".$path." » ".$file;
break;
case 4:
echo $temp." » ".$path." » ".$subpath." » ".$file;
break;
}
unset($count);
unset($intermediate);
?>
Mir scheint die Lösung mit $count nicht so ganz der Bringer zu sein, ich weiss aber nicht, wie ich das anders lösen könnte.
Wäre nett, wenn mir da jemand den einen oder anderen Denkanstoß liefern könnte.
Gruß
Kurt
Moin!
Ich hab mal was zusammengebastelt:
Etwas, was ziemlich kompliziert ist, und wesentlich einfacher sein könnte. War ja zu erwarten, das. :)
Wie ich deinem Code entnehme, bastelst du an Vorarbeiten zur Realisierung einer automatischen Brotkrumennavigation.
Die Eckdaten:
Eingangsdatum ist als einziges ein Pfad zur aktuell darzustellenden Datei. Ausgangsdaten sollen Links zu allen übergeordneten Dateien sein, wobei dazu die Index-Seite (URL endet auf Slash) des die aktuelle Seite enthaltenden Verzeichnisses sowie aller übergeordneter Verzeichnisse sein soll. Dass diese Links funktionieren, dafür ist der Webmaster durch Anlegen entsprechender Seiten selbst verantwortlich (eine Prüfung dafür zu integrieren, wäre aber natürlich möglich).
Als Schema:
Der URL- bzw. Dateipfad "includes/javascript/popups/irgendwas.txt" soll zerlegt werden:
Linktext: Ziel:
irgendwas "includes/javascript/popups/irgendwas.txt"
popups "includes/javascript/popups/"
javascript "includes/javascript/"
includes "includes/"
(Ja, die letzte Stufe ist nicht so wirklich Ideal - aber es geht ums Prinzip, nicht um eine fertig nutzbare Lösung.)
Und wenn ich jetzt mal deinen Code kommentiere...
<?php
Error_Reporting(E_ALL);
$link = "Startseite";
$title = "Das ist ein Seitentitel"; //wird später aus Array ausgelesen.c
$string ="includes/javascript/popups/irgendwas.txt"; //wird später aus Array ausgelesen.$intermediate = explode("/",$string);
Bis hierhin ist alles toll - vielleicht mit Ausnahme des Variablennamens $intermediate - der wäre mir persönlich viel zu lang und zu wenig beschreibend.
$count = 0;
foreach($intermediate as $elem)
{
$count++;
}
Oh, Wahnsinn. Du willst ermitteln, wieviele Elemente sich im Array $intermediate befinden. Wozu gibts eigentlich die Funktion count()? ... :)
switch($count)
{
case 2:
$temp = $intermediate[0];
$file = $intermediate[1];
break;
case 3:
$temp = $intermediate[0];
$path = $intermediate[1];
$file = $intermediate[2];
break;
case 4:
$temp = $intermediate[0];
$path = $intermediate[1];
$subpath = $intermediate[2];
$file = $intermediate[3];
break;
}
Bei Switch ist kein Fall für Werte kleiner als 2 vorgesehen. Und kein Fall für Werte größer als 4.
Warum die einzelnen Werte hier umkopiert werden, ist auch nicht ersichtlich. Die Werte aus $intermediate werden 1:1 in neue Variablen gepackt - schön nach Fällen getrennt.
$link = strtoupper($link);
Hm, das hier könnte man auch weiter oben schon erledigen - also direkt oben bei $link = "STARTSEITE" anstatt $link="Startseite". Aber du willst ja universelleren Code, und $link wird nicht unbedingt so simpel definiert werden.
Aber das hier:
if ($count>=3)
{
$path = strtoupper($path);
}
if ($count==4)
{
$subpath = strtoupper($subpath);
}
Warum unterscheidest du hier nochmal zwei Fälle, obwohl du im vorhergehensen switch() doch auch einfach hättest schreiben können:
case 3:
$path = strtoupper($intermediate[1]);
break;
case 4:
$path = strtoupper($intermediate[1]);
$subpath = strtoupper($intermediate[2]);
break;
$temp = str_replace($temp,' <a href="index.php">'.$link.'</a> ',$temp);
Diese Zeile erscheint mir auch etwas stark überfrachtet mit Funktionalität. Gemäß deiner Zeilen weiter oben steht in $temp immer das erste Verzeichnis "includes" drin.
Deine Anwendung der str_replace-Funktion sorgt nun dafür, dass in der Variablen $temp das Vorkommen des Textes, welcher sich in der Variablen $temp befindet, durch den Text ' <a href="index.php">'.$link.'</a> ' ersetzt wird.
Diese Ersetzung gilt immer. Da egal, was in $temp drinsteht, der gesamte Text immer durch den neuen ersetzt wird, kannst du genausogut auch einfach schreiben:
$temp = ' <a href="index.php">'.$link.'</a> ';
Und fertig.
$file = str_replace($file,$title,$file);
Hier genau dasselbe. Du tauscht in der Variablen $file den Komplettinhalt der Variablen $file gegen den Inhalt der Variablen $title.
Einfacher: $file = $title;
Noch einfacher: Es weglassen, und einfach $title verwenden.
switch($count)
{
case 2:
Und hier verzweigst du wieder je nach Anzahl der gefundenen Bestandteile, wie schon zuvor oben.
Das könnte man insgesamt auch stark vereinfachen, indem man wirklich nur einmal verzweigt, und jeweils alle notwendigen Aktivitäten zur Ausgabe einer Brotkrumennavigation für die jeweilige Stufe ausgibt.
echo $temp." » ".$file;
break;
case 3:
echo $temp." » ".$path." » ".$file;
break;
case 4:
echo $temp." » ".$path." » ".$subpath." » ".$file;
break;
}
unset($count);
unset($intermediate);
Hinterher die Variablen löschen, um Spuren zu verwischen? Naja, unnötig, aber nicht unbedingt falsch.
?>
Mir scheint die Lösung mit $count nicht so ganz der Bringer zu sein, ich weiss aber nicht, wie ich das anders lösen könnte.
Wäre nett, wenn mir da jemand den einen oder anderen Denkanstoß liefern könnte.
Grundlage effiziennten Programmierens ist es, Gleichheiten zu erkennen, sinnvoll zusammenzufassen und in einen mehr oder weniger universellen Code zu packen.
Soll heißen: Deine Aufgabe besteht eigentlich nur darin, deinen Pfad in Einzelteile zu zerhacken, und jeden einzelnen "irgendwie" passend zu verarbeiten. Dabei ist es für eine Brotkrumennavigation eher irrelevant, ob du nun zwei, drei, vier oder noch mehr Verzeichnisse im Pfad hast - alle müssen ja, da sie die Dokumentenstruktur repräsentieren, irgendwie gleichartig verarbeitet und in Links oder zumindest Text umgesetzt werden.
Mit anderen Worten:
Splitte den Pfad in Einzelelemente.
Das erste Element wird ignoriert. Stattdessen wird ein Standardlink auf die Startseite ausgegeben (echo).
Alle weiteren Elemente (Array-Index 1 bis unendlich) werden wie folgt behandelt:
Wenn das aktuelle Element nicht das letzte ist, dann wird der Text, der im Array beim aktuellen Index steht (meinetwegen auch strtoupper() gemacht) ausgegeben.
Wenn das aktuelle Element das letzte ist, wird der Seitentitel ausgegeben.
In Code umgesetzt:
<?php
Error_Reporting(E_ALL);
$link = "Startseite";
$title = "Das ist ein Seitentitel"; //wird später aus Array ausgelesen.c
$string ="includes/javascript/popups/irgendwas.txt";
$pfad = explode("/",$string); // ein schön kurzer, bezeichnender Arrayname ;)
echo ' <a href="index.php">'.$link.'</a> ';
for ($i=1; $i<count($pfad); $i++)
{
if ($i < count($pfad))
{
echo " » ".strtoupper($pfad[$i]);
}
else
{
echo " » ".$title;
}
}
?>
Und fertig. Sollte (ich habe es nicht 100% geprüft - und insbesondere den Code nicht getestet) so ungefähr dasselbe ausgeben, wie dein Code auch - nur eben wesentlich kürzer und übersichtlicher.
Und (großes Plus): Da eine Brotkrumennavigation wenig Sinn macht, wenn man die einzelnen Links nicht auch anklicken kann: Hier hast du jetzt eine einzige Zeile, die für die Ausgabe der (jetzt noch nicht) Links zuständig ist (direkt nach dem IF). Dort kannst du deinen Link zusammenbasteln.
Beispiel: Wenn du einen Link der Form href="/includes/pfad/subpfad/" je nach Bedarf zusammensetzen willst, dann böte sich dafür folgendes an:
echo " $raquo; <a href="/".implode("/",array_slice($pfad,0,$i+1))."/">".strtoupper($pfad[$i])."</a>";
Ja, das ist ein starker Tobak - PHP hat so viele wunderbare Funktionen, die einem viel Arbeit abnehmen.
array_slice gibt einen Teil eines Arrays als Array zurück. Die drei Parameter sind: 1. Das große Array, 2. Das Startelement, 3. Die Anzahl der Elemente.
Und dieses Teilarray wird mit implode() wieder zu einem String zusammengebacken.
Schau dir im Zweifel einfach mal die Beispiele bei php.net an, um zu verstehen, was da bei array_slice passiert. http://de2.php.net/manual/de/function.array-slice.php
Und wenn jetzt noch Klarheiten bestehen: Die kriege ich auch noch weg. :)
- Sven Rautenberg
Hello,
...mensch, hier wird man ja beim Lesen ganz hundrig. Könnt Ihr mich mal aufklären, was eine Brotkurmennavigation ist? Gibts die auch in flüssig? Oder ist sowas überflüssig? *gg*
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Tom,
...mensch, hier wird man ja beim Lesen ganz hundrig.
Was denkst du, wie es mir erging? Ich soll das ganze ja auch noch verstehen! :o)
Könnt Ihr mich mal aufklären, was eine Brotkurmennavigation ist? Gibts die auch in flüssig? Oder ist sowas überflüssig? *gg*
Das ist das, was du z.B. hier http://faq.united-web.at/index.php?content=scrollbars zwischen Werbung und Überschrift linksbündig stehen siehst. ;-)
Im Grunde eigentlich nur eine Dokumentation des Dateipfades, die erst dann wirklich interessant wird, wenn man die Unterpunkte auch anklicken kann und die dazugehörige Seite erhält. ;-).
Gruß
Kurt
Hallo Sven,
Etwas, was ziemlich kompliziert ist, und wesentlich einfacher sein könnte. War ja zu erwarten, das. :)
*schluck*
Die Eckdaten:
Eingangsdatum ist als einziges ein Pfad zur aktuell darzustellenden Datei. Ausgangsdaten sollen Links zu allen übergeordneten Dateien sein, wobei dazu die Index-Seite (URL endet auf Slash) des die aktuelle Seite enthaltenden Verzeichnisses sowie aller übergeordneter Verzeichnisse sein soll. Dass diese Links funktionieren, dafür ist der Webmaster durch Anlegen entsprechender Seiten selbst verantwortlich (eine Prüfung dafür zu integrieren, wäre aber natürlich möglich).
Grundsätzlich gibt es zur Zeit keine anderen Seiten als die Startseite und die aktuell angezeigte Seite. Das könnte sich aber in weiterer Folge noch ändern, da eventuell, je nach Themengebiet, eine allgemein erklärende Seite hinzukommen könnte.
Als Schema:
Der URL- bzw. Dateipfad "includes/javascript/popups/irgendwas.txt" soll zerlegt werden:
[...]
includes "includes/"(Ja, die letzte Stufe ist nicht so wirklich Ideal - aber es geht ums Prinzip, nicht um eine fertig nutzbare Lösung.)
Die würde ja immer durch den Home-Link ersetzt.
Und wenn ich jetzt mal deinen Code kommentiere...
<?php
[...]
$intermediate = explode("/",$string);
Bis hierhin ist alles toll - vielleicht mit Ausnahme des Variablennamens $intermediate - der wäre mir persönlich viel zu lang und zu wenig beschreibend.
Ja, lang isser. :-)
Aber, da ich im Zuge dieser Arbeiten gleichzeitig auch meine Englischkenntnisse ein wenig aufpolieren möchte, versuche ich halt nach Möglichkeit, englische Begriffe zu verwenden.
[...]
Oh, Wahnsinn. Du willst ermitteln, wieviele Elemente sich im Array $intermediate befinden. Wozu gibts eigentlich die Funktion count()? ... :)
Ja, jetzt, wo du es sagst... :o)
Ich kannte diese Funktion noch nicht. *g*
switch($count)
[...]
}Bei Switch ist kein Fall für Werte kleiner als 2 vorgesehen. Und kein Fall für Werte größer als 4.
Das Script wird im Endeffekt noch von einer if-Abfrage umklammert, welche das Script nur dann zur Ausführung kommen lässt, wenn $_GET['content'] gesetzt ist.
Ist $_GET['content'] nicht gesetzt, wird nichts ausgegeben.
Deshalb wird es in dieser Struktur keinen Fall geben, der kleiner als 2 oder größer als 4 ist, es sei denn, jemand ergänzt die URL auf der Startseite händisch durch ...index.php?content=
Sollte man diesen unwahrscheinlichen Fall abfangen?
Warum die einzelnen Werte hier umkopiert werden, ist auch nicht ersichtlich. Die Werte aus $intermediate werden 1:1 in neue Variablen gepackt - schön nach Fällen getrennt.
Weil die Variablen(mit Ausnahme von $temp), abhängig von zutreffenden Fall, unterschiedliche Werte haben können.
$link = strtoupper($link);
Hm, das hier könnte man auch weiter oben schon erledigen - also direkt oben bei $link = "STARTSEITE" anstatt $link="Startseite". Aber du willst ja universelleren Code, und $link wird nicht unbedingt so simpel definiert werden.
In diesem Fall hast du wohl recht, diese Variable wird wohl nirgens anders gebraucht.
Aber das hier:
if ($count>=3)
[...]
}
Warum unterscheidest du hier nochmal zwei Fälle, obwohl du im vorhergehensen switch() doch auch einfach hättest schreiben können:
case 3:
$path = strtoupper($intermediate[1]);
break;
[...]
break;
Wenn ich das gewußt hätte, daß eine derartige Verschachtelung möglich ist, hätte ich es wahrscheinlich gemacht. ;-)
Oder aber, anders ausgedrückt, es fehlte mir am Weitblick... :-)
$temp = str_replace($temp,' <a href="index.php">'.$link.'</a> ',$temp);
Diese Zeile erscheint mir auch etwas stark überfrachtet mit Funktionalität. Gemäß deiner Zeilen weiter oben steht in $temp immer das erste Verzeichnis "includes" drin.
Nein, genaugenommen gibt es exakt zwei Fälle. Einen, bei dem immer includes drinnensteht, aber auch_genau_eine_Seite(Gästebuch), welche in einem anderen Verzeichnis liegt, was aber, genau genommen, nichts an der Intention ändert.
Diese Ersetzung gilt immer. Da egal, was in $temp drinsteht, der gesamte Text immer durch den neuen ersetzt wird, kannst du genausogut auch einfach schreiben:
$temp = ' <a href="index.php">'.$link.'</a> ';
Und fertig.
$file = str_replace($file,$title,$file);
Hier genau dasselbe. Du tauscht in der Variablen $file den Komplettinhalt der Variablen $file gegen den Inhalt der Variablen $title.
Einfacher: $file = $title;
Noch einfacher: Es weglassen, und einfach $title verwenden.
*hmpf*
So einfach könnte es sein, wenn man es schaffen würde, strukturiertes Denken einfach an und abzuschalten...
switch($count)
{
case 2:Und hier verzweigst du wieder je nach Anzahl der gefundenen Bestandteile, wie schon zuvor oben.
Das könnte man insgesamt auch stark vereinfachen, indem man wirklich nur einmal verzweigt, und jeweils alle notwendigen Aktivitäten zur Ausgabe einer Brotkrumennavigation für die jeweilige Stufe ausgibt.
Das verstehe ich nicht. Was meinst du damit?
[...]
In Code umgesetzt:<?php
Error_Reporting(E_ALL);
$link = "Startseite";
$title = "Das ist ein Seitentitel"; //wird später aus Array ausgelesen.c
$string ="includes/javascript/popups/irgendwas.txt";$pfad = explode("/",$string); // ein schön kurzer, bezeichnender Arrayname ;)
echo ' <a href="index.php">'.$link.'</a> ';
for ($i=1; $i<count($pfad); $i++)
{
if ($i < count($pfad))
{
echo " » ".strtoupper($pfad[$i]);
}
else
{
echo " » ".$title;
}
}
?>Und fertig. Sollte (ich habe es nicht 100% geprüft - und insbesondere den Code nicht getestet) so ungefähr dasselbe ausgeben, wie dein Code auch - nur eben wesentlich kürzer und übersichtlicher.
Ja stimmt, kürzer ist ein Hilfsausdruck. ;-)
Ich habe das Beispiel mal getestet, es funktioniert aber so nicht. Es wird immer der gesamte Pfad ausgegeben, der else-Zweig wird ignoriert. Testweise habe ich ihn entfernt, keine Auswirkung.
Dann hab ich mal überlegt: count($pfad)_muss_beim Zählen bei 2 beginnen, d.h. wenn count($pfad) bei 3 ist, ist $i 2.
deshalb wird immer der if-Teil ausgeführt.
Denn wenn count($pfad) bei 0 beginnen würde, wäre $i in der if-Abfrage immer um eins größer als count, weshalb immer der else-Zweig angesprungen werden müsste.
Hab ich da einen Knoten in meinen Überlegungen???
Denn sonst ist nachfolgendes für mich nicht erklär-/erfassbar:
Ich habe die if-Abfrage folgendermaßen abgeändert, und so funktioniert es:
if ($i < count($pfad)-1)
In dieser Konfiguration wird beim letzten Teil auf else verzweigt.
Und (großes Plus): Da eine Brotkrumennavigation wenig Sinn macht, wenn man die einzelnen Links nicht auch anklicken kann: Hier hast du jetzt eine einzige Zeile, die für die Ausgabe der (jetzt noch nicht) Links zuständig ist (direkt nach dem IF). Dort kannst du deinen Link zusammenbasteln.
Beispiel: Wenn du einen Link der Form href="/includes/pfad/subpfad/" je nach Bedarf zusammensetzen willst, dann böte sich dafür folgendes an:
echo " $raquo; <a href="/".implode("/",array_slice($pfad,0,$i+1))."/">".strtoupper($pfad[$i])."</a>";
Ja, das ist ein starker Tobak - PHP hat so viele wunderbare Funktionen, die einem viel Arbeit abnehmen.
Ja, das_ist_starker Tobak. :)
Ich hab mal ein wenig rumgespielt und dabei hat mich anfänglich verwirrt, daß, egal, wie ich die Werte verändere, immer der gesamte Pfad ausgegeben wird. Erst, als ich in die Statuszeile schaute, hat sich das Missverständnis geklärt. *g*
array_slice gibt einen Teil eines Arrays als Array zurück. Die drei Parameter sind: 1. Das große Array, 2. Das Startelement, 3. Die Anzahl der Elemente.
Und dieses Teilarray wird mit implode() wieder zu einem String zusammengebacken.
Schau dir im Zweifel einfach mal die Beispiele bei php.net an, um zu verstehen, was da bei array_slice passiert. http://de2.php.net/manual/de/function.array-slice.php
Die Beispiele dort sind mir leider in der Regel zu theoretisch, die kann ich meist nicht umsetzen. Deshalb probiere ich auch immer rum. ;-)
Und wenn jetzt noch Klarheiten bestehen: Die kriege ich auch noch weg. :)
recht viel Arbeit haste damit nimmer... :o)
Danke dir!
Gruß
Kurt
Moin!
switch($count)
{
case 2:Und hier verzweigst du wieder je nach Anzahl der gefundenen Bestandteile, wie schon zuvor oben.
Das könnte man insgesamt auch stark vereinfachen, indem man wirklich nur einmal verzweigt, und jeweils alle notwendigen Aktivitäten zur Ausgabe einer Brotkrumennavigation für die jeweilige Stufe ausgibt.
Das verstehe ich nicht. Was meinst du damit?
Du hast zweimal Switch und dazwischen etwas IF.
switch ($count)
...
if ($count)
if ($count)
switch ($count)
An allen Stellen trennst du nach immer denselben drei Fällen (Werte 2, 3 oder 4 für $count). Da "dazwischen" nichts passiert, was in allen drei Fällen gemeinsam passiert, kannst du deine Trennung auch in genau einem Switch unterbringen.
Ich habe die if-Abfrage folgendermaßen abgeändert, und so funktioniert es:
if ($i < count($pfad)-1)
In dieser Konfiguration wird beim letzten Teil auf else verzweigt.
Der typische "off by one"-Fehler. War ja klar, ich baue gerne Fehler ein, die absolut unscheinbar sind. Aber du warst gewarnt. :)
Schau dir im Zweifel einfach mal die Beispiele bei php.net an, um zu verstehen, was da bei array_slice passiert. http://de2.php.net/manual/de/function.array-slice.php
Die Beispiele dort sind mir leider in der Regel zu theoretisch, die kann ich meist nicht umsetzen. Deshalb probiere ich auch immer rum. ;-)
Die Beispiele dort sind genau dafür da, das Funktionieren zu erklären, mehr nicht. Weil die Erklärung dann doch immer etwas theoretisch ist (negative Werte, was ist mit Null, etc.), kann ich bei den Beispielen schnell sehen, wie das gemeint ist (vorausgesetzt, die Beispiele sind nicht falsch).
- Sven Rautenberg
Hallo Sven,
Das verstehe ich nicht. Was meinst du damit?
Du hast zweimal Switch und dazwischen etwas IF.
switch ($count)
...
if ($count)
if ($count)
switch ($count)An allen Stellen trennst du nach immer denselben drei Fällen (Werte 2, 3 oder 4 für $count). Da "dazwischen" nichts passiert, was in allen drei Fällen gemeinsam passiert, kannst du deine Trennung auch in genau einem Switch unterbringen.
Ach so, du meintest in der Art?
switch($count)
{
case 2:
$temp = $intermediate[0];
echo $temp." » ".$title;
break;
case 3:
$temp = $intermediate[0];
$path = strtoupper($intermediate[1]);
echo $temp." » ".$path." » ".$title;
break;
case 4:
$temp = $intermediate[0];
$path = strtoupper($intermediate[1]);
$subpath = strtoupper($intermediate[2]);
echo $temp." » ".$path." » ".$subpath." » ".$title;
break;
}
Ich habe die if-Abfrage folgendermaßen abgeändert, und so funktioniert es:
if ($i < count($pfad)-1)
In dieser Konfiguration wird beim letzten Teil auf else verzweigt.
Der typische "off by one"-Fehler. War ja klar, ich baue gerne Fehler ein, die absolut unscheinbar sind. Aber du warst gewarnt. :)
Ja, wobei mich die Zählweise von count() nun doch etwas überrascht hat und ich einige Zeit brauchte, um auf die Lösung zu kommen. ;-)
Die Logik dahinter ist mir nicht ganz klar.
Danke dir!
Gruß
Kurt
Moin!
Ach so, du meintest in der Art?
Genau.
Der typische "off by one"-Fehler. War ja klar, ich baue gerne Fehler ein, die absolut unscheinbar sind. Aber du warst gewarnt. :)
Ja, wobei mich die Zählweise von count() nun doch etwas überrascht hat und ich einige Zeit brauchte, um auf die Lösung zu kommen. ;-)
Die Logik dahinter ist mir nicht ganz klar.
Das erste Element eines Arrays hat den Index Null. Wenn es existiert, hat das Array aber ein Element (welches von count gezählt wird).
$array = array('ein element');
echo $array[0]; // gibt den Text 'ein element' aus.
echo count($array); // gibt die Zahl 1 aus.
echo $array[1]; // gibt nichts aus bzw. führt zu einer Notice: undefined array-index
- Sven Rautenberg
Hallo Sven,
Ja, wobei mich die Zählweise von count() nun doch etwas überrascht hat und ich einige Zeit brauchte, um auf die Lösung zu kommen. ;-)
Die Logik dahinter ist mir nicht ganz klar.Das erste Element eines Arrays hat den Index Null. Wenn es existiert, hat das Array aber ein Element (welches von count gezählt wird).
$array = array('ein element');
echo $array[0]; // gibt den Text 'ein element' aus.
echo count($array); // gibt die Zahl 1 aus.
echo $array[1]; // gibt nichts aus bzw. führt zu einer Notice: undefined array-index
Das heisst, bei dieser Zeile
for ($i=1; $i<count($pfad); $i++)
hiesse das nun aufgelöst(bezogen auf meinen angenommenen Pfad "includes/javascript/popups/irgendwas.txt";),
for($i=1; 1<4[1]; 1+1) //Ausgabe:javascript, nächster Durchlauf
for( 2<4[2]; 2+1) //Ausgabe:popus, nächster Durchlauf
for(3<4[3]; 3+1) //Ausgabe:irgendwas.txt anstatt $title, nächster Durchlauf
if (4<4[3]) //Bedingung nicht erfüllt, also müsste hier doch auf
else
{
echo " » ".$title;
}
verzweigt werden und somit $title zusätzlich hinten angehängt werden???
Tut es aber nicht, es geschieht weiter gar nichts. *kopfkratz*
Gruß
Kurt
Moin!
Das heisst, bei dieser Zeile
for ($i=1; $i<count($pfad); $i++)
Bedenke, welche Umsetzungsbedingungen für die for-Schleife gelten.
Du gibst drei Anweisungen (so nenne ich sie jetzt mal) an, getrennt durch ein Semikolon.
Anweisung 1 ($i=1) wird vor Beginn der Schleife einmal ausgeführt.
Anweisung 2 ($i<count($pfad)) wird vor Beginn eines Schleifendurchlaufs geprüft. Wenn der Ausdruck "wahr" ergibt, wird die Schleife durchlaufen.
Anweisung 3 ($i++) wird nach Ende eines Schleifendurchlaufs ausgeführt.
Man kann eine for-Schleife auch als while-Schleife schreiben:
$i=1;
while ($i<count($pfad))
{
//Anweisungen
$i++;
}
Wichtig zu bemerken ist bei diesem konkreten Beispiel: Wenn count($pfad) den Wert 4 hat, dann wird die for-Schleife mit den Werten 1, 2 und 3 für $i durchlaufen, aber nicht mit 4!
Das macht durchaus Sinn, denn count($pfad) liefert die Anzahl der Arrayelemente. Der höchste Arrayindex hingegen ist um eins kleiner, weil ja der Index Null existiert.
hiesse das nun aufgelöst(bezogen auf meinen angenommenen Pfad "includes/javascript/popups/irgendwas.txt";),
for($i=1; 1<4[1]; 1+1) //Ausgabe:javascript, nächster Durchlauf
for( 2<4[2]; 2+1) //Ausgabe:popus, nächster Durchlauf
for(3<4[3]; 3+1) //Ausgabe:irgendwas.txt anstatt $title, nächster Durchlauf
Hier ist es falsch. $i wird erst am Ende des Durchlaufs von 3 auf 4 erhöht.
Und wenn $i = 4 ist, ist es nicht mehr kleiner als count($pfad), also wird die Schleife abgebrochen und ...
if (4<4[3]) //Bedingung nicht erfüllt, also müsste hier doch auf
...diese Bedingung wird niemals erreicht.
- Sven Rautenberg
Hallo Sven,
Ach so, schon klar.
Ich habe die Bediingung der For-Schleife nicht mit der Bedingung der Verzweigung in Kontext gesetzt.
Wenn die If Bedingung nun mit -1 ausgestattet ist, wird beim vorletzen Versuch auf else verzweigt, weil ja da die if-Bedingung==false ist und die Schleife_danach_beim letzten Versuch abgebrochen.
Ohne -1 wird aber die Schleife abgebrochen,_bevor_die if-Bedingung false wird. Deshalb auch kein else.
Digitale Logik ist zwingend logisch. ;-)
Gruß
Kurt
Hallo Sven,
Das ist das fertige Script, das ich nun schon einsetze:
-----------------------------------------------------------------------------------------
<?php
if (isset($_GET['content']) && isset($sitelist[$_GET['content']]) && isset($title[$_GET['content']]))
{
$link = "STARTSEITE";
$title = $title[S_GET['content']]; //Array in array.inc.php
$string = $sitelist[$_GET['content']]; //Array in array.inc.php
if (isset($_GET['menu'])) //prüft, ob Parameter 'menu' gesetzt ist und verändert Wert in $add.
{
switch($_GET['menu'])
{
case 1:
$add = '?menu=1'; //$add, falls $_GET['menu']==1(Listennavigation)
break;
case 2:
$add = '?menu=2'; //$add, falls $_GET['menu']==2(Navigation für NN4.x)
}
}
else
{
$add = ''; //$add, falls $_GET['menu'] nicht gesetzt ist(Javascriptmenü).
}
$pfad = explode("/",$string); //zerteilt $sitelist[$_GET['content']]an den "/"
echo ' <a class="dyn" href="index.php'.$add.'">'.$link.'</a> '; //gibt Link zur Startseite aus.
for ($i=1; $i<count($pfad); $i++)
{
if ($i < count($pfad)-1)
{
echo " » ".strtoupper($pfad[$i]); //gibt den Pfad zur Seite aus.
}
else
{
echo " » ".$title; //gibt die Überschrift der Seite aus.
}
}
}
?>
-----------------------------------------------------------------------------------------------
Die beiden Arrays in array.inc.php sind so aufgebaut, daß ich daraus alles, was ich auf der Seite brauche, erzeugen kann.
Sind da in dem Script deiner Meinung nach noch Ungereimtheiten?
Gruß
Kurt
Moin!
Sind da in dem Script deiner Meinung nach noch Ungereimtheiten?
Sieht nicht so aus. :)
- Sven Rautenberg
Hallo Sven,
Goil, endlich auch mal was richtig gemacht! ;-)
Danke dir!
Gruß
Kurt
Hallo Sven,
Blödsinn, so sollte es sein:
switch($count)
{
case 2:
$temp = ' <a href="index.php">'.$link.'</a> ';
echo $temp." » ".$title;
break;
case 3:
$temp =' <a href="index.php">'.$link.'</a> ';
$path = strtoupper($intermediate[1]);
echo $temp." » ".$path." » ".$title;
break;
case 4:
$temp = ' <a href="index.php">'.$link.'</a> ';
$path = strtoupper($intermediate[1]);
$subpath = strtoupper($intermediate[2]);
echo $temp." » ".$path." » ".$subpath." » ".$title;
break;
}
Der typische "off by one"-Fehler. War ja klar, ich baue gerne Fehler ein, die absolut unscheinbar sind. Aber du warst gewarnt. :)
Ja, wobei mich die Zählweise von count() nun doch etwas überrascht hat und ich einige Zeit brauchte, um auf die Lösung zu kommen. ;-)
Die Logik dahinter ist mir nicht ganz klar.
Danke dir!
Gruß
Kurt