Der Martin: Fehler bei zu kürzendem String

Beitrag lesen

Hi,

Ist der Zugriff auf ein bestimmtes Zeichen im Array-Stil schneller als substr?
Kürzer ist der Code allemal, was evtl. ein kleines Quentchen an Performance-Gewinn bedeutet.

etwas schneller ist es möglicherweise; ich vermute(!), dass ein simpler Datenzugriff schneller ist als ein Funktionsaufruf. Der Performancegewinn dürfte aber eher akademisch sein und im Rauschen untergehen. Allerdings ist es IMO übersichtlicher zu lesen.

Der html-Code im Browser sieht wie folgt aus:

<a class="Liste"><span class="Ab18">1...</a><br>

<a class="Liste">1x Mit Eisenplatten ...</a><br>
<a class="Liste">1x Mittelbraune Lede...</a>

  
Okay, die Daten fehlen also schon im Quellcode. Ich wollte sichergehen, dass sie nicht aufgrund eines HTML-Fehlers oder einer bestimmten CSS-Regel bloß einfach nicht angezeigt werden.  
  

> Warum ignoriert mein php-Code die Ausgabe des schliessenden span-Tags?  
  
Gute Frage. Nächste Frage?  ;-)  
  
Ich greife deinen ursprünglichen Code hier nochmal auf, weil du da einen kapitalen Bock drin hast, den ich jetzt erst sehe.  
  

> ~~~php

      if (substr ($_SESSION["Warenkorb"][$x]["Artikel"], 0, 1) == "#")  

>          $Artikel = '<span class="Ab18">' . $_SESSION["Warenkorb"][$x]["Menge"] . "x " . substr ($_SESSION["Warenkorb"][$x]["Artikel"], 1, strlen ($_SESSION["Warenkorb"][$x]["Artikel"])) . "</span>";  
>       else  
>          $Artikel = $_SESSION["Warenkorb"][$x]["Menge"] . "x " . $_SESSION["Warenkorb"][$x]["Artikel"];  
>   
>       if (strlen ($Artikel) > 22)  
>       {  
>          if (substr ($Artikel, 22, 1) == " ")  
>             $Laenge = 19;  
>          else  
>             $Laenge = 20;  
>       }  
>       else  
>          $Laenge = strlen ($Artikel);  
>   
>       echo '<a class="Liste">' . substr ($Artikel, 0, $Laenge) . "..." . "</a>";

Du betrachtest hier strlen($Artikel), nachdem du diesen String komplett als HTML-Code zusammengebaut hast. Die öffnenden und schließenden span-Tags, die zusammen 21+5 Zeichen ausmachen, gehen also voll in die Länge mit ein. Also trifft die Abfrage auf strlen()>22 bei Ab18-Artikeln in jedem Fall zu, und du schneidest nach 22 Zeichen ab. Übrig bleibt das öffnende Tag (21 Zeichen) und das erste Zeichen des Nutzinhalts (die erste Ziffer der Mengenangabe). Das beantwortet wohl deine obige Frage.

Was lernen wir daraus? - Genau, jedwede Verarbeitung (in diesem Fall das Kürzen der Einträge) sollte auf den Rohdaten passieren, nicht auf dem generierten Ausgabe-Code.

Andere Frage: Warum sind Ab18-Einträge nicht verlinkt? Klar, weil's dein PHP-Code so erzeugt. Aber ist das Absicht?

Die (warum falsche/zu lange?) Längenberechnung habe ich jetzt rausgenommen

Warum falsch? Weil du die gesamte Stringlänge angibst, aber vorn schon ein Zeichen weglassen willst. Du "bestellst" den String also um ein Zeichen zu lang. Das macht nichts, weil strlen() nicht über das String-Ende hinaus arbeitet, aber es ist dennoch ein Logikfehler.

Ciao,
 Martin

--
Dem Philosoph ist nichts zu doof.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(