Ternäre Anweisung Hilfe...

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ternäre Anweisung Hilfe...

    Ich wollte heute mal Anfangen alle if then else Abfragen auf die Kurzform (Ternär) umzustellen. In diesem Satz ist das Problem dann auch schon integriert.

    Nun möchte ich wenn ein Dateiname länger als 0 Zeichen ist ein DIV ausgeben, ansonsten eben nicht.
    Nun habe ich:
    Code:
    if(strlen($row_mail['dateiname']) >= 50) {
    		echo "<br><div id='clicking' style='float:right'><button>↓ Klick ↓</button></div>";
    		}
    der auch funktioniert.
    Darauf folgen ergab sich für mich diese Schreibweise (dachte ich):

    Code:
    echo (strlen($row_mail['dateiname']) >= 50) ? "<br><div id='clicking' style='float:right'><button>↓ Klick ↓</button></div>" : "";
    Leider will der nicht so wirklich.

    Darauf Fußend ergeben sich für mich 2 Fragen:
    Warum geht das nicht ?
    und:
    Sollte ich das lassen und lieber Fußball spielen gehen ??

  • #2
    Ich fang mal mit der letzten Frage an:
    Originally posted by thommy1972de View Post
    Sollte ich das lassen und lieber Fußball spielen gehen ??
    Ja.
    Anderenfalls wäre es auch hilfreich, wenn du deine Fertigkeiten der deutschen Sprache etwas ausbauen würdest, speziell im Bereich von Groß- und Kleinschreibung.

    Originally posted by thommy1972de View Post
    Warum geht das nicht?
    Weil du die Funktionsweise des "ternären" Operators nicht verstanden hast. Der ist aus Prinzip auf Expressions ("Ausdrücke") beschränkt und tut nicht mit Statements ("Anweisungen"). Im PHP-Wunderland ist echo ein Statement, genauer gesagt: ein Sprachkonstrukt ("language construct"). [color=#999999](Auch wenn die Online-Dokumentation echo verwirrenderweise unter der URL "function.echo.php" führt)[/color].

    Du kannst daher ?: innerhalb eines Echo-Statements verwenden, aber nicht umgekehrt. Und in der Aussage steckt auch schon die Lösung deines Teil- Problems:
    PHP Code:
    echo $bedingung
        
    $langer_text_den_niemand_lesen_wird
        
    ''// einfach ein Leer-String 
    Auf dein konkretes Beispiel angewandt:
    PHP Code:
    echo strlen($row_mail['dateiname']) >= 50
        
    '<br/><div id="clicking" style="float:right"><button>↓ Klick ↓</button></div>'
        
    ''
    Falls dir das nicht gefällt, solltest du dich mit print() und seiner Familie (printf(), vprintf(), sprint(), sprintf(), vsprintf(), ...) bekanntmachen. Die gelten in PHP als Funktionen, sind damit Expressions, und können in ?:-Konstrukte eingebaut werden:
    PHP Code:
    strlen($row_mail['dateiname']) >= 50
        
    ? print('<br/><div id="clicking" style="float:right"><button>↓ Klick ↓</button></div>')
        : 
    null// tut gar nichts 
    --
    Falls das alles zu unverständlich war, hilft vielleicht eine benutzerdefinierte Funktion weiter, die prinzipiell das Gleiche macht wie der Operator:

    PHP Code:
    function tOpAlsFunktion(
        
    $bedingung// das, was vor dem ? steht 
        
    $falls// das was danach, aber vor dem : steht 
        
    $fallsNicht // das was nach dem : steht
    ) {
        if (
    $bedingung) {
            return 
    $falls;
        }
        else {
            return 
    $fallsNicht;
        }

    --

    Was dich darüberhinaus noch interessieren könnte:
    1.) Echo kann mehrere durch Komma getrennte Ausdrücke hintereinander ausgeben.
    2.) Man pappt HTML nicht direkt in PHP-Code.
    3.) IDs als HTML-Attribute sollten Datei-weit einmalig vergeben werden. Mir deucht, dein id="clicking" sollte eher ein class="clicking" werden.
    4.) Und schließlich Grundsätzliches:
    Originally posted by thommy1972de View Post
    Ich wollte heute mal Anfangen alle if then else Abfragen auf die Kurzform (Ternär) umzustellen.
    Warum? Wenn du die Funktionsweise eines if-(elseif-)else-Statements besser verstehst, dann bleib dabei. ?: kann auch nicht mehr. Dafür hat es mehr eingebaute Fallstricke.
    Last edited by fireweasel; 18-03-2017, 09:36.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Comment


    • #3
      Das Beispiel vom TE ist völlig sinnbefreit, da es kein else gibt und somit der ternäre Operator Quatsch ist.

      Comment


      • #4
        Originally posted by bandit600 View Post
        Das Beispiel vom TE ...
        Mir fällt gerade auf, dass es so, wie es niedergeschrieben ist, eigentlich funktionieren müsste (von eventuellen Notices wegen nicht existierender Variablen mal abgesehen):
        PHP Code:
        echo (strlen($row_mail['dateiname']) >= 50
            ? 
        "<br><div id='clicking' style='float:right'><button>↓ Klick ↓</button></div>"
            
        ""
        Da hab ich wohl das echo an der falschen Stelle verortet.
        Also liegt der Fehler woanders.

        Originally posted by bandit600 View Post
        ... ist völlig sinnbefreit, da es kein else gibt und somit der ternäre Operator Quatsch ist.
        Es gibt einen "else"-Zweig. Der liefert einen Leer-String, den echo in den Ausgabekanal schreibt. Das mag (dir) unnötig erscheinen, ist aber weder sinnbefreit noch Quatsch. Allerdings macht es, an dieser Stelle eingesetzt, den Quelltext schwerer lesbar als eine If-Konstruktion.

        Auf den Umstand, dass man nicht zwanghaft jedes If-Else-Statement auf die Operatorschreibweise umstellen sollte, hatte ich hingewiesen.
        Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

        Comment


        • #5
          Originally posted by fireweasel View Post
          Das mag (dir) unnötig erscheinen, ist aber weder sinnbefreit noch Quatsch.
          Soso, dann kannst du mir ja bestimmt den Sinn von

          PHP Code:
          echo ""
          erklären, ich sehe nämlich keinen darin

          Comment


          • #6
            Ein klassisches Beispiel für ein „leeres echo“ wäre so was:

            PHP Code:
            <?php
            $classStr 
            = ($element['isActive']) ? ' class="active"' '';
            ?>
            <div<?=$classStr?>>...</div>
            Beziehungsweise ganz exakt so:

            PHP Code:
            <div<?php echo ($element['isActive']) ? ' class="active"' ''?>>...</div>
            Die Alternative würde zum Beispiel so aussehen:

            PHP Code:
            <?php
            $classStr 
            '';
            if (
            $element['isActive']) {
                
            $classStr ' class="active"';
            }
            ?>
            <div<?=$classStr?>>...</div>
            Ein potenzieller Gewinn in Sachen Verständlichkeit/Lesbarkeit ist vielleicht etwas situativ, aber das gilt in gewisser Weise auch für andere Operatoren. Auch jede Verknüpfung von &&-Ausdrücken ließe sich etwa mit geschachtelten if-Anweisungen schreiben.

            Ist letztlich irgendwie auch eine Stilfrage. *hilflose Armbewegung*
            Last edited by mermshaus; 20-03-2017, 04:19.

            Comment

            Working...