Ankündigung

Einklappen
Keine Ankündigung bisher.

while(empty($var)) funktioniert nicht wie gewünscht

Einklappen

Neue Werbung 2019

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

  • while(empty($var)) funktioniert nicht wie gewünscht

    Hallo, bei folgendem Beispiel kommt immer nur empty als ausgabe raus, warum?? die while bedingung sollte doch beendet werden, sobalt $tax_class einen Wert zugewiesen bekommt!

    PHP-Code:
    <?php
    $tree_class 
    = Array( "0" => Array(     "id" => "1",
                                        
    "tree_id" => "1",
                                        
    "lang" => "de",
                                        
    "tax_class" => "Reich"
                                        
    )

                        );


    $language "de";

    while (empty(
    $tax_class)) {
        foreach (
    $tree_class as $key => $value) { $tax_class = ($value['lang'] == $language) ? $value['tax_class'] : NULL ; } // wunschsprache
        
    foreach ($tree_class as $key => $value) { $tax_class = ($value['lang'] == 'sci') ? $value['tax_class'] : NULL ; } // wunschsprache nicht vorhanden dann sci
        
    foreach ($tree_class as $key => $value) { $tax_class = ($value['lang'] == 'de') ? $value['tax_class'] : NULL ; } // sci nicht vorhanden dann de
        
    foreach ($tree_class as $key => $value) { $tax_class = ($value['lang'] == 'en') ? $value['tax_class'] : NULL ; } // de nicht vorhanden dann en
        
    foreach ($tree_class as $key => $value) { $tax_class $value['tax_class']; } // en nicht vorhanden dann erster eintrag der kommt
        
    $tax_class 'empty';
    }


    echo 
    $tax_class;
    ?>

  • #2
    Der Code in der while-Schleife wird vollständig durchlaufen. Am Ende wird der Variablen $tax_class der Wert 'empty' zugewiesen. Danach endet die Schleife, da die Bedingung nicht mehr zutrifft.
    Die Frage ist also: wieso schreibst du eine while-Schleife, die nur ein einziges Mal durchläuft?

    Kommentar


    • #3
      Weil es so programmiert ist. Am Ende wird immer 'empty' gesetzt.

      Foreach-Schleifen, die in einer Zeile geschrieben sind, sind übrigens schlecht lesbar.

      Kommentar


      • #4
        @chris77: Beschreibe mal was du da machen möchtest. So etwas wie default-Werte setzen?

        Kommentar


        • #5
          Code von links nach rechts lesen, yay.
          Dreh die Reihenfolge deiner Foreach-Schleifen mal um, dann startest du mit empty als Standardwert, gehst dann über "erster eintrag der kommt" bis zur Wunschsprache, je nachdem was vorhanden ist.

          Man kanns bestimmt auch besser machen (break oder continue), hab aber keine Lust zu lesen was da passiert
          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

          Kommentar


          • #6
            Hallo, ich habs jetzt wie folgt gemacht, ist natürlich rechenintensiv und dauert länger, ist aber nur eine kleine db die abgefragt wird und nur für den heimgebrauch, also 1 benutzer, da gehts schon

            PHP-Code:
                            // wahrlos erste sprache in tree_class wählen oder empty wenn komplett leer
                            
            $tax_class = (empty($tree_class)) ? 'empty' $tree_class['0']['tax_class'] ;

                            
            // en nehmen wenn vorhanden
                            
            foreach ($tree_class as $key => $value) {
                                if(
            $value['lang'] == 'en') { $tax_class $value['tax_class']; }
                                }

                            
            // en mit de überschreiben
                            
            foreach ($tree_class as $key => $value) {
                                if(
            $value['lang'] == 'de') { $tax_class $value['tax_class']; }
                                }

                            
            // de mit sci überschreiben
                            
            foreach ($tree_class as $key => $value) {
                                if(
            $value['lang'] == 'sci') { $tax_class $value['tax_class']; }
                                }

                            
            // sci mit wunschsprache überschreiben
                            
            foreach ($tree_class as $key => $value) {
                                if(
            $value['lang'] == $language) { $tax_class $value['tax_class']; }
                                } 

            Kommentar


            • #7
              Never mind

              Kommentar


              • #8
                Ich würde es so machen:
                PHP-Code:
                <?php
                $tree_class 
                = [
                        [
                            
                "id" => "1",
                            
                "tree_id" => "1",
                            
                "lang" => "de",
                            
                "tax_class" => "Reich"
                        
                ], [                                    
                             
                "id" => "2",
                            
                "tree_id" => "2",
                            
                "lang" => "en",
                            
                "tax_class" => "Rich"
                        
                ]
                ];                    

                $language "fdsdr";
                $langs array_column($tree_class'tax_class''lang');
                $tax_class $langs[$language] ?? $langs['en'] ?? $langs['de'] ?? $langs['sci'] ?? 'empty';

                print_r($tax_class);

                Kommentar


                • #9
                  Danke Zeichen32 , genau das ist meine Strategie, ich poste hier den Unsinn so lang, bis mir jemand alles auf silbernem Tablett darbringt.

                  Ok, hab bisschen übertrieben... aber wenn er etwas lernen will, dann der erste Schritt für ihm würde - logisches Denken daran, was da sein Code genau macht.
                  Signaturrrrrrr

                  Kommentar


                  • #10
                    K313 der TE hat ja eine für sich funktionierende Lösung gefunden. Also sehe ich hier kein Problem darin, ein alternativen Weg zu zeigen.

                    Kommentar


                    • #11
                      Zitat von Zeichen32 Beitrag anzeigen
                      K313 der TE hat ja eine für sich funktionierende Lösung gefunden. Also sehe ich hier kein Problem darin, ein alternativen Weg zu zeigen.
                      Sehe ich ähnlich. Gerade Einsteiger haben noch nicht all diese Muster im Kopf. Sowas muss trainiert werden. Und dann kommt immer noch einer der es hübscher kann.

                      bitcoin.de <- Meine Freelancerwährung

                      Kommentar


                      • #12
                        Hallo, hat mir jetzt doch keine Ruhe gelassen, und ich kam zu dem Ergebnis:

                        PHP-Code:
                        while ($language) {
                            
                        // wunschsprache
                            
                        foreach ($tree_class as $key => $value) {
                                if(
                        $value['lang'] == $language) {
                                    
                        $tax_class $value['tax_class'];
                                    break 
                        2;
                                }
                            }

                            
                        // wunschsprache nicht vorhanden dann sci
                            
                        foreach ($tree_class as $key => $value) {
                                if(
                        $value['lang'] == 'sci') {
                                    
                        $tax_class $value['tax_class'];
                                    break 
                        2;
                                }
                            }

                            
                        // sci nicht vorhanden dann de
                            
                        foreach ($tree_class as $key => $value) {
                                if(
                        $value['lang'] == 'de') {
                                    
                        $tax_class $value['tax_class'];
                                    break 
                        2;
                                }
                            }

                            
                        // de nicht vorhanden dann en
                            
                        foreach ($tree_class as $key => $value) {
                                if(
                        $value['lang'] == 'en') {
                                    
                        $tax_class $value['tax_class'];
                                    break 
                        2;
                                }
                            }

                            if (!empty(
                        $tree_class)) {
                                
                        // en nicht vorhanden dann erster eintrag der kommt
                                
                        $tax_class $tree_class[0]['tax_class'];
                                break;
                            } else {
                                
                        // not exit
                                
                        $tax_class "empty";
                                break;
                            }

                        Aber jetzt muss ich mich mal mit der lösung von Zeichen32 auseinandersetzen, das sieht natürlich um ein vielfaches eleganter aus....


                        Danke erstmal für die viele Hilfe!

                        LG, Chris




                        Kommentar


                        • #13
                          Zitat von Alpha Beitrag anzeigen

                          Sehe ich ähnlich. Gerade Einsteiger haben noch nicht all diese Muster im Kopf. Sowas muss trainiert werden. Und dann kommt immer noch einer der es hübscher kann.
                          der vom TE gepostete Code schreib nach abstraction.
                          Ein simples Posten von DRY hätte wohl genügt.

                          Allein die Tatsache mehrmals
                          PHP-Code:
                           foreach ($tree_class as $key => $value) {} 
                          die Schleife zu durchalufen, sollte den TE abschrecken.

                          Ich bin wie K313 der Meinung nur eigeninitiative zu unterstüzen.

                          Kommentar


                          • #14
                            Zitat von Zeichen32 Beitrag anzeigen
                            Ich würde es so machen:
                            Als Ergänzung, weil ich gerade gefühlt 10 Minuten gesucht habe, der Link zum Handbuch: http://php.net/manual/de/language.op...rison.coalesce


                            [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                            [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                            Kommentar


                            • #15
                              Zitat von tomBuilder Beitrag anzeigen
                              Ich bin wie K313 der Meinung nur eigeninitiative zu unterstüzen.
                              Und dazu zähle ich auch die Bereitschaft wenigstens eine Aufgabenstellung verständlich zu formulieren um sinnvoll helfen zu können. Ich sehe immer noch nicht was der TE erreichen möchte.
                              Das Array sieht so aus als komme es aus einer DB. Wenn ja, kann die Aufgabe womöglich bereits mit der Abfrage erledigt werden.
                              Die Lösung von Zeichen32 kann m.E. auch nicht per Copy & Paste übernommen werden (Das ist auch gut so). Die Kommentare in den "Lösungen" des TE verstehe ich anders.

                              Kommentar

                              Lädt...
                              X