Switch Case mit mehreren Operatoren


tklustig

Erfahrenes Mitglied
#1
Hallo Leute,
ich habe in meiner Applikation folgende Operatoren, dessen Zustände ich mittels einer UND-Verknüpfung überprüfen muss:
Code:
/*
Boolsche Algebra --->
A:Dateianhang vorhanden
B:im System vermerkt
C:multiple Empfänger
Fall1:NOT(A) && NOT(B) && NOT(C)
Fall2:(A) && NOT(B) && NOT(C)
.
.
Fall8:(A) && (B) && (C)
*/
Es ergeben sich also 2^3 verschiedene Zustände, was letztlich zu 2^3 Konditionen führt. Kann man diese Konditionen mit einem Switch/Case abfragen. Die Manuals zeigen nur einen Operator auf, also so
PHP:
<?php
    switch($zahl) {
        case 0:
            echo 'Durch 0 darf man nicht teilen';
            break;
        case 1:
            echo 'Die Zahl 1 ist sehr klein';
            break;
        case 99999:
            echo 'Das ist eine sehr große Zahl';
            echo 'kurz vor hunderttausend';
            break;
    }
?>
Ich benötige dieses Konstrukt allerdings so, was gegen die Syntax verstößt.
PHP:
<?php
    switch($zahl,$vergleich,$IstGerade) {
        case 1,10,false:
            echo 'Zahl liegt zwischen 1 und 10 und ist ungerade';
            break;
.
.
    }
?>
Lässt sich meine Intention umsetzen, und wenn, wie lautet die korrekte Syntax?
P.S.: Mir geht es darum, ob es prinzipiell möglich ist, dem SWITCH mehr als ein Argument zu übergeben
 
Zuletzt bearbeitet:

Kalito

Erfahrenes Mitglied
#2
Naja schon. Führt den jede Kombination zu einem anderen Ergebnis oder kann man gewisse Sachen zusammenfassen?

Ansonsten würde das ganze so aussehen (unvollständig):
PHP:
$a = true;
$b = true;
$c = false;

switch(TRUE)
{
    case ($a && $b && $c) :   $result = 'abc';  break;
    case ($a && $b && !$c) :   $result = 'ab';  break;
    case ($a && !$b && !$c) :   $result = 'a';  break;
    case (!$a && $b && $c) :   $result = 'bc';  break;
}
 
echo $result;
 

tklustig

Erfahrenes Mitglied
#3
Jede Kombination führt zu einem anderen Verhalten.
Ob das so klappt? Mit TRUE kann ich wohl kaum operieren. Ich zeige ma' das IF-Konstrukt für einen einfachen Fall auf
Code:
//hier nur 2^2 Möglichkeiten
          if ($extract_inner_Cc[0] == "" && $extract_inner_Bcc[0] == "") {
                        $SendObject = Yii::$app->mailer->compose()->setFrom($Quelladresse)
                                ->setTo($extract_inner_Receiver)
                                ->setSubject($model->betreff)
                                ->setHtmlBody($model->bodytext)
                                ->setTextBody($model->bodytext)
                                ->send();
                    } else if ($extract_inner_Cc[0] != "" && $extract_inner_Bcc[0] == "") {
                        $SendObject = Yii::$app->mailer->compose()->setFrom($Quelladresse)
                                ->setTo($extract_inner_Receiver)
                                ->setCc($extract_inner_Cc)
                                ->setSubject($model->betreff)
                                ->setHtmlBody($model->bodytext)
                                ->setTextBody($model->bodytext)
                                ->send();
.
.
 

Kalito

Erfahrenes Mitglied
#4
Waum dann so kompliziert?

PHP:
$SendObject = Yii::$app->mailer->compose();
$SendObject->setTo($extract_inner_Receiver)
                 ->setSubject($model->betreff)
                 ->setHtmlBody($model->bodytext)
                 ->setTextBody($model->bodytext);

if ($extract_inner_Cc[0])
{
    $SendObject->setCc($extract_inner_Cc)
}

$SendObject->send();
nur mal so eine Frage am Rand: In der If-Bedingung prüfst du auf $extract_inner_Cc[0], verwendest aber dann $extract_inner_Cc. Ist das so gewollt? Wenn kein cc angegeben ist, ist das Array doch sicher leer. und du musst nur prüfen, ob das besagte Array leer ist. So würde bei einem leeren Array die Fehlermeldung kommen, dass er den Index 0 nicht kennt.
 

tklustig

Erfahrenes Mitglied
#5
Yuup. Ist so gewollt. Mein Array ist nämlich nicht leer, sonst würde ich die Funktion empty() verwenden. Das hat was mit der Erstellung des Arrays durch die Funktion explode() zu tun...
Sicher hast du Recht, was die Versandgeschichte betrifft. Deine Version spart Code, entbindet mich allerdings nicht von der Implementierung von 2^2 Konditionen.
Bei 2^2 mag das noch angehen, bei 2^3 an anderer Stelle wird's allerdings schon unübersichtlicher. Deshalb meine Eingangsfrage, die so noch nicht beantwortet ist...

Hier nochmals das gesamte IF-Konstrukt ,welches ich durch ein SWITCH/CASE-Statement ersetzen möchte:
PHP:
           $SendObject = Yii::$app->mailer->compose();
                 $SendObject->setFrom($Quelladresse)
                            ->setTo($extract_inner_Receiver)
                            ->setSubject($model->betreff)
                            ->setHtmlBody($model->bodytext)
                            ->setTextBody($model->bodytext);
                    if ($extract_inner_Cc[0] == "" && $extract_inner_Bcc[0] == "") {
                        $SendObject->send();
                    } else if ($extract_inner_Cc[0] != "" && $extract_inner_Bcc[0] == "") {
                        $SendObject->setCc($extract_inner_Cc)->send();
                    } else if ($extract_inner_Cc[0] == "" && $extract_inner_Bcc[0] != "") {
                        $SendObject->setBcc($extract_inner_Bcc)->send();
                    } else if ($extract_inner_Cc[0] != "" && $extract_inner_Bcc[0] != "") {
                        $SendObject->setBcc($extract_inner_Bcc)->setCc($extract_inner_Cc)->send();
                    }
 
Zuletzt bearbeitet:

Kalito

Erfahrenes Mitglied
#6
Doch beantwortet wurde sie schon.

PHP:
$SendObject = Yii::$app->mailer->compose();
$SendObject->setTo($extract_inner_Receiver)
                 ->setSubject($model->betreff)
                 ->setHtmlBody($model->bodytext)
                 ->setTextBody($model->bodytext);

switch(TRUE)
{
    case ($extract_inner_Cc[0] != "" && $extract_inner_Bcc[0] == "") :   $SendObject->setCc($extract_inner_Cc)->send();  break;
    case ($extract_inner_Cc[0] == "" && $extract_inner_Bcc[0] != ""):  $SendObject->setBcc($extract_inner_Bcc)->send();  break;
    case ($extract_inner_Cc[0] != "" && $extract_inner_Bcc[0] != ""):  $SendObject->setBcc($extract_inner_Bcc)->setCc($extract_inner_Cc)->send();  break;
    default: $SendObject->send(); break;
}
oder du machst es wie folgt:
PHP:
$SendObject = Yii::$app->mailer->compose();
$SendObject->setTo($extract_inner_Receiver)
                 ->setSubject($model->betreff)
                 ->setHtmlBody($model->bodytext)
                 ->setTextBody($model->bodytext);

if ($extract_inner_Cc[0])
{
    $SendObject->setCc($extract_inner_Cc)
}

if ($extract_inner_Bcc[0])
{
    $SendObject->setCc($extract_inner_Bcc)
}

$SendObject->send();
Meiner Meinung nach ist der zweite Code besser wartbar, als switch case
 

tklustig

Erfahrenes Mitglied
#7
Da hast du sicherlich Recht. Prinzipiell weiß ich dank Deiner Hilfe jetzt, wie ich das SWICH/CASE Statement aufzubauen habe. Für die 2^3 Fälle werde ich es so machen. Hier verbleibt das IF-Konstrukt.
P.S.: In anderen Foren kann man eine Art Reputationspunkte für erfolgreiche Antworten vergeben. Hier finde ich nur den "Gefällt mir" Link, der intern wohl als Boolean abgespeichert wird. Gibt es hier ähnliches? Anhand welcher Kriterien wird der Mitlgiedstatus eingestuft bzw. verändert?
 

Neue Beiträge