kostenloser Webspace werbefrei: lima-city


Frage bzgl. Schleifen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    drafed-map

    Kostenloser Webspace von drafed-map

    drafed-map hat kostenlosen Webspace.

    Ich bin gerade auf ein Problem gestoßen. Warum funktioniert das nicht?
    $var = "Lorem ipsum
    
    
    dolor sit amet,
    
    
    
    
    consectetur adipiscing elit.
    In bibendum leo sed ipsum iaculis
    
    
    
    
    convallis. Donec libero arcu,
    
    
    ultrices viverra.";
    
    while($var != ($var = str_replace("\n\n\n", "\n\n", $var))) {}
    Der Code soll dafür sorgen, dass maximal zwei Zeilenumbrüche aufeinander folgen.

    Ich habe keine praktische Anwendung dafür, d.h. es muss nicht darauf geachtet werden, dass der String nicht "\n\n \n" beinhaltet. Ich möchte nur besser verstehen, wie PHP arbeitet.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Das hier dürfte Dich der Antwort näher bringen:
    $var = "Lorem ipsum
    
    
    dolor sit amet,
    
    
    
    
    consectetur adipiscing elit.
    In bibendum leo sed ipsum iaculis
    
    
    
    
    convallis. Donec libero arcu,
    
    
    ultrices viverra.";
    
    $var = str_replace("\n", "[n]", $var);
    $var = str_replace("\r", "[r]", $var);
    echo $var;
    
    /*
    
    \r = #13 = Carriage Return (zum Beginn der Zeile)
    \n = #10 = Line Feed oder New Line (zur nächsten Zeile)
    */


    So wie ich das verstanden habe ist diese \r\n notation Windows spezifisch.
    Falls Du also die php-Datei mal versuchsweise auf einem Mac,Linux und Windows-Computer bzw als ansi oder asci (die php datei) speicherst würde mich auch mal interessieren ob du da Unterschiede findest.

    Beitrag zuletzt geändert: 14.5.2011 20:11:48 von simuliertes
  4. Autor dieses Themas

    drafed-map

    Kostenloser Webspace von drafed-map

    drafed-map hat kostenlosen Webspace.

    Ich habe meinen Code in der PHP Interactive Shell, also mit PHP-CLI, unter Linux Ubuntu per Direkteingabe ausgeführt.

    Dein Code gibt mir übrigens
    Lorem ipsum[n][n][n]dolor sit amet,[n][n][n][n][n]consectetur adipiscing elit.[n]In bibendum leo sed ipsum iaculis[n][n][n][n][n]convallis. Donec libero arcu,[n][n][n]ultrices viverra.
    aus, da "\n" einfach durch "[n]" und "\r" einfach durch "[r]" ersetzt wird.

    Ich bin auch gar nicht auf der Suche, nach einer Lösung für dieses Problem. Es liegt überhaupt kein Problem vor. Ich will nur wissen, wieso der Code so nicht funktioniert.
  5. Ach schau an.
    Tja bei mir kommt nämlich heraus:
    Lorem ipsum[r][n][r][n][r][n]dolor sit amet,[r][n][r][n][r][n][r][n][r][n]consectetur adipiscing elit.[r][n]In bibendum leo sed ipsum iaculis[r][n][r][n][r][n][r][n][r][n]convallis. Donec libero arcu,[r][n][r][n][r][n]ultrices viverra.


    ...weshalb der code schon von Anfang an nicht funktionieren kann (bei meinem Windows).
    Dasselbe ergebniss hatte ich also auch bei Dir erwartet
  6. Ich verstehe nicht recht was du willst drafed-map. Deine Schleife ist equivalent zu:
    $var = str_replace("\n\n\n", "\n\n", $var);
    while($var != $var) {}

    Da `$var != $var` immer zu `false` evaluiert kann man es auch aufschreiben als:
    $var = str_replace("\n\n\n", "\n\n", $var);


    Was du sicherlich meintest ist:
    $var = preg_replace('\R{3,}', "\n\n", $var);
  7. Autor dieses Themas

    drafed-map

    Kostenloser Webspace von drafed-map

    drafed-map hat kostenlosen Webspace.

    Ich definiere die Variable $var doch in der Bedingung neu.
  8. Ich verstehe drafed-map so das er meint das es dasselbe (aber kürzer geschrieben) wäre wie:
    while($var != str_replace("\n\n\n", "\n\n", $var)) {$var = str_replace("\n\n\n", "\n\n", $var);}


    Siehe dazu auch das
    echo ($var = str_replace("\n\n\n", "\n\n", $var));

    ..ja funktioniert.

    Das Hier...
    $var = preg_replace('\R{3,}', "\n\n", $var);

    würde wohl zwar das richtige Ergebniss liefern aber klärt die verständnissfrage der php-struktur nicht.
  9. @drafed-map: Wenn du eine Expression a la `expr_left T_IS_NOT_EQUAL expr_right` schreibst, also beispielsweise `$var != ($var = str_replace("\n\n\n", "\n\n", $var))`, dann muss PHP, um die beiden Expressions zu vergleichen, natürlich beide Seiten erstmal ausführen. PHP wird also deine `expr_right` also `$var = str_replace("\n\n\n", "\n\n", $var)` ausführen. D.h. zu dem Zeitpunkt, wo die Expressions verglichen werden, steht auf beiden Seiten `$var`, was logischerweise nicht ungleich sein kann.
  10. Autor dieses Themas

    drafed-map

    Kostenloser Webspace von drafed-map

    drafed-map hat kostenlosen Webspace.

    simuliertes schrieb:
    Ich verstehe drafed-map so das er meint das es dasselbe (aber kürzer geschrieben) wäre wie:
    while($var != str_replace("\n\n\n", "\n\n", $var)) {$var = str_replace("\n\n\n", "\n\n", $var);}
    Genau, das soll das in abgekürzter Form sein.


    nikic schrieb:
    @drafed-map: Wenn du eine Expression a la `expr_left T_IS_NOT_EQUAL expr_right` schreibst, also beispielsweise `$var != ($var = str_replace("\n\n\n", "\n\n", $var))`, dann muss PHP, um die beiden Expressions zu vergleichen, natürlich beide Seiten erstmal ausführen. PHP wird also deine `expr_right` also `$var = str_replace("\n\n\n", "\n\n", $var)` ausführen. D.h. zu dem Zeitpunkt, wo die Expressions verglichen werden, steht auf beiden Seiten `$var`, was logischerweise nicht ungleich sein kann.
    Ich dachte, dass er einfach zuerst das linke "nachschlägt', es sich merkt, das rechte "nachschlagen" will, dabei etwas berechnen muss, das Ergebnis in die Variable schreibt, es sich außerdem merkt und die beiden Werte dann miteinander vergleicht. Dann, wenn $var neu definiert wird, müsste der erste Wert doch schon längst feststehen.

    PHP rechnet an dieser Stelle aber zuerst das aus, was berechnet werden muss. Das funktioniert:
    while(($var."") != ($var = str_replace("\n\n\n", "\n\n", $var))) {}
    Hier wird einfach ein leerer String an die Variable gehängt, d.h. der linke Teil der Bedingung muss auch berechnet werden und meine Logik geht auf.
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!