Webdesign in Siegen

switch mit foreach-schleife erstellen

Fragen zum Thema PHP können hier gestellt werden

Moderator: Basti

switch mit foreach-schleife erstellen

Beitragvon Nase am 20.04.2008, 12:46

Hi.
Ich möchte so eine Switch-Verzweigung
Code: Alles auswählen
switch ($site):
case 'kontakt':
$datei='kontakt.txt';
$title='Kontakt';
break;
case 'impressum':
$datei='impressum.txt';
$title='Impressum';
break;
default:
$datei='content.txt';
$title='Startseite';
endswitch;
?>


automatisch von PHP erstellen lassen, indem der Array ausgelesen wird:

Code: Alles auswählen
$navi = array(
            "1" => array("", "Startseite", "context"),
            "2" => array("kontakt",  "Kontakt", "kontakt"),
            "3" => array("impressum",  "Impressum", "impressum"));


Mein Ansatz war:
Code: Alles auswählen

switch ($site):
   foreach ($navi as $id=>$wert)
            {
            if($id != "1")   {
                        case $wert[0]:
                        $file="$wert[2].'.txt';
                        $title=$wert[1];
                        break;
                           }
            else   {
                        default:
                        $file=$wert[2].'.txt';
                   $title=$wert[1];
                         }
            }
          endswitch;

Warum gehtn das nicht?
Nase
Mitglied
 
Beiträge: 38
Registriert: 10.04.2008

Re: switch mit foreach-schleife erstellen

Beitragvon Guillermo am 20.04.2008, 12:50

Wieso machst du nach dem "switch ($site)" einen Doppelpunkt? Muss da nicht ne geschweifte Klammer hin?
Gebildet ist der, der weiß, wo er findet, was er nicht weiß.
Benutzeravatar
Guillermo
Mitglied
 
Beiträge: 412
Registriert: 01.10.2007
Wohnort: Auerbach i.d.Opf

Re: switch mit foreach-schleife erstellen

Beitragvon Basti am 20.04.2008, 13:19

Ich würde mich wundern wenn das überhaupt so funktioniert, höchstens mit der eval() Funktion ließe sich das vielleicht noch realisieren.

Im Allgemeinen sind solche "PHP Code"-Erzeugungen aber eher uneffektiv und nicht zu empfehlen. Du solltest lieber einen anderen Weg wählen.

Wieso machst du es denn nicht so (oder so ähnlich)?:

Code: Alles auswählen
if(in_array($site,$navi))
{
  $title = $navi[$site][1];
  $file = $navi[$site][2].'.txt';
}
else {
  $title = 'Startseite';
  $file = 'content.txt';
}


Das sollte vom Prinzip her genauso funktionieren wie das was du gerade vorhast wenn ich deine Codeschnipsel richtig verstanden habe.
Benutzeravatar
Basti
Moderator
 
Beiträge: 1864
Registriert: 15.06.2006
Wohnort: Rheinbreitbach

Re: switch mit foreach-schleife erstellen

Beitragvon Nase am 20.04.2008, 16:48

Da stehen so viele Bäume vor dem Wald...
Natürlich geht das erste Beispiel nicht.
Danke Basti, für den Vorschlag, der allerdings nicht funktioniert hat. Hab den "in_array"-Befehl noch nicht benutz und mir deshalb diese Lösung überlegt:
Code: Alles auswählen
foreach ($navi as $wert)
   {
            if ($wert[0] == $site)
            {$file = $wert[2].'.txt';
            $title =  $wert[1];
            break 1;
            }
            else
            {
            $file= 'content.txt';
            $title =  'Startseite';
            }
            }

Ich frage mich gerade: Wenn jetzt $site = impressum ist, dh der letzte Punkt im Array, ist es dann ungünstig, dass die foreach-Schleife erstmal 3 Mal durchgeführt wird und jedesmal die else-Anweisung ausgeführt wird?
(In dem Projekt für das ich diese Schleife benutze, ist der Array 5mal so lang.)
Nase
Mitglied
 
Beiträge: 38
Registriert: 10.04.2008

Re: switch mit foreach-schleife erstellen

Beitragvon Basti am 20.04.2008, 18:38

Wie ich bereits sagte ist eine solche Lösung nicht sonderlich effizient, deshalb solltest du lieber einen Ansatz wie meinen wählen.
Habe ihn jetzt mal so umgeschrieben, dass er funktionieren sollte (hatte da in der anderen Version ein wenig Unsinn geschrieben ;) ):

Code: Alles auswählen
$navi = array(
  "kontakt" => array("Kontakt", "kontakt"),
  "impressum" => array("Impressum", "impressum")
);

if(array_key_exists($site,$navi))
{
  $title = $navi[$site][1];
  $file = $navi[$site][2].'.txt';
}
else {
  $title = 'Startseite';
  $file = 'content.txt';
}


Wenn $site jetzt beispielweise "kontakt" ist, werden die entsprechenden Daten aus dem Array zugeordnet. Existiert kein Eintrag im Array so wird die Startseite verwendet.
Benutzeravatar
Basti
Moderator
 
Beiträge: 1864
Registriert: 15.06.2006
Wohnort: Rheinbreitbach

Re: switch mit foreach-schleife erstellen

Beitragvon Nase am 20.04.2008, 20:34

Ja, tatsächlich, wenn mein Skript-Laufzeit-Berechner korrekt funktioniert, dann wird deine Lösung einige 1000mal schneller durchgeführt als meine.
Danke!
edit.:.. uhh... liegt wahrscheinlich daran, dass es noch nicht so funktioniert, wie ichs brauche. Der index der Arrays soll nummeriert sein, weil der Array später noch anderweitig benutzt wird.
Nase
Mitglied
 
Beiträge: 38
Registriert: 10.04.2008

Re: switch mit foreach-schleife erstellen

Beitragvon Basti am 20.04.2008, 21:42

Achso, das konnte ich ja nicht wissen.

Ist es denn möglich die "anderweitige Benutzung" umzuschreiben? Oder werden die ganzzahligen Keys dafür zwingend gebraucht?
Benutzeravatar
Basti
Moderator
 
Beiträge: 1864
Registriert: 15.06.2006
Wohnort: Rheinbreitbach

Re: switch mit foreach-schleife erstellen

Beitragvon Nase am 20.04.2008, 22:45

So, jetzt hauts hin! Hab den Array aufgesplittet, nach deinem System aufgebaut und die Schleifen umgestellt.
Danke für deine Beratung , hab einiges gelernt. :thumbsup:
Nase
Mitglied
 
Beiträge: 38
Registriert: 10.04.2008


Zurück zu PHP

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste