Ternäre Anweisung Hilfe...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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:
    Zitat von thommy1972de Beitrag anzeigen
    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.

    Zitat von thommy1972de Beitrag anzeigen
    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:
    Zitat von thommy1972de Beitrag anzeigen
    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.
    Zuletzt geändert von fireweasel; 18.03.2017, 10:36.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


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

      Kommentar


      • #4
        Zitat von bandit600 Beitrag anzeigen
        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.

        Zitat von bandit600 Beitrag anzeigen
        ... 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!

        Kommentar


        • #5
          Zitat von fireweasel Beitrag anzeigen
          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

          Kommentar


          • #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*
            Zuletzt geändert von mermshaus; 20.03.2017, 05:19.

            Kommentar

            Lädt...
            X