Betinget visning

Tonny Kluften

Administrator
Jeg bruker denne koden for å vise innhold på spesifike sider, f.eks. vise forskj. innhold i footer på forskj. språk. Men er dette en metode som bruker my ressurser på server? finnes det en bedre måte å gjøre det jeg ønsker på?
Og hvis dette er bra nok, kan man angi flere mapper enn "/en/" på samme linje i den første bolken i koden her? Dette kan være aktuelt hvis f.eks. både engelsk (en) og spansk (es) skal ha samme footer. Nå er det kun engelsk som en angitt.

PHP:
<?php
switch ($uri = $_SERVER["REQUEST_URI"]) {

    case(strstr($uri, '/en/')):
        echo ('<div id="wrapper-en">
		<div id="content-en">');
    break;

    default :
        echo ('<div id="wrapper">
		<div id="content">');
    break;
}
?>
 

adeneo

Medlem
Det er en standard switch/case, og den bruker ikke mye ressurser på serveren.

Det finnes selvfølgelig andre måter å gjøre det på, om de er "bedre" er vel kanskje mest en smakssak, men dersom du bare skal sjekke om en string inneholder noe eller ikke ville kanskje en vanlig if/else vært enklere?

For å sjekke flere ting, f.eks både /en/ og /es/ i samme case, så kan du vel gjøre slik:

PHP:
switch ($uri = $_SERVER["REQUEST_URI"]) { 

    case(strstr($uri, '/en/')||strstr($uri, '/es/')): 
        echo ('<div id="wrapper-en"><div id="content-en">'); 
    break; 
    default : 
        echo ('<div id="wrapper"><div id="content">'); 
}

Eller kontrollere med preg_ettellerannet og en regex.

Enklere ville sikkert være å gjøre (dersom det ikke skal sjekkes flere muligheter, da er switch/case tingen) :

PHP:
$uri = $_SERVER["REQUEST_URI"];
if (strstr($uri, '/en/')||strstr($uri, '/es/')) {
    echo ('<div id="wrapper-en"><div id="content-en">'); 
}else{
    echo ('<div id="wrapper"><div id="content">'); 
}

Eller kanskje:

PHP:
echo preg_match('/\/e(s|n)\//', $_SERVER["REQUEST_URI"]) ? '<div id="wrapper-en"><div id="content-en">' : '<div id="wrapper"><div id="content">';
 
Sist redigert:

Pong

Jeg selger sʇɥƃıluʍop :)
strstr er billigere enn en regex (både cpu-messig og design-messig -- jeg bruker mer tid på å feilsøke regex enn strstr). Men denne kodesnutten har blitt ganske dyrt når man tar med all tid som folk her bruker på å kikke på den ;-)

Grunnen at koden er som den er, er muligens pga det kommer etterpå noe som:
Kode:
<?php
switch ($uri = $_SERVER["REQUEST_URI"]) {

    case(strstr($uri, '/en/')):
        echo ('<div id="wrapper-en">
        <div id="content-en">');
    break;

    case(strstr($uri, '/klingon/')):
        echo ('<div id="wrapper-kl">
        <div id="content-kl">');
    break;

    default :
        echo ('<div id="wrapper">
        <div id="content">');
    break;
}
?>

Jeg tror ikke at en switch er noe dyrere enn en if; det kjøres vel gjennom cpu'en på samme måte som if then elseif then elseif then else.
Men jeg lurer litt på hva jeg ville brukt selv.. det er nok veldig få ganger at jeg velger en switch på grunn av eventuelle fremtidige endringer...
 

adeneo

Medlem
Er enig i at PHP's innebygde string funksjoner er enklere og raskere å bruke enn regex, og også at en switch/case sannsynligvis er akkurat like rask som en if/else.

I ingen av tilfellene er det vel normalt noe som er merkbart for brukeren, i hvert fall ikke for en slik enkel test av en URI, det må nok forholdsvis mange tusen runder til for at det skal være noe merkbar forskjell tidsmessig og CPU messig, så det er vel egentlig ett fett hva man bruker, og da mener jeg det enkleste er å bruke det som er lettest å lese for den som skriver koden.

Jeg velger altid ternary hvis det er forholdsvis enkelt, if/else for litt mer kompliserte ting, og switch/case kun hvor mange muligheter skal kontrolleres slik at det passer med switch.
 

nukleuz

Medlem
Hvor mye ressurser som kreves av hver enkelt funksjon baserer seg litt på hvor mange avhengigheter. Også systemets oppbygging og dets type implementering må vurderes opp i mot behov.

Skal det være innhold betingen på flere sider ville jeg muligens gått for en enkel regexp med en form for inkludering iht de spesifikke matchene i regexp.

For et større system, med flere avhengigheter, ville jeg valgt noe slikt - kanskje! :)

Pastebin &bull; contentBasedOnURL.php &bull; development.giaever.org
 
Topp