2010-06-15 8 views
2

Voici un morceau de code PHP je pense n'est pas très "joli", je suis sûr qu'il est possible de le simplifier avec for ou quelque chose comme ça. J'essaie de trouver un algorithme qui fonctionnerait pour cela, mais je ne peux pas le comprendre, s'il vous plaît aidez-moi.PHP: simplifier avec l'algorithme?

Voici le code:

if(isset($four)) 
{ 
if(isset($navi[$one][$two][$three][$four])) echo "/content/" . $one . "/" . $two . "/" . $three . "/" .$four . ".php"; 
else echo "error"; 
} 
else if(isset($three)) 
{ 
if(isset($navi[$one][$two][$three])) echo "/content/" . $one . "/" . $two . "/" . $three . ".php"; 
else echo "error"; 
} 
else if(isset($two)) 
{ 
if(isset($navi[$one][$two])) echo "/content/" . $one . "/" . $two . ".php"; 
else echo "error"; 
} 
else if(isset($one)) 
{ 
if(isset($navi[$one]))echo "/content/" . $one . ".php"; 
else echo "error"; 
} 
else 
{ 
echo "error"; 
}

Merci!

Répondre

2

mise à jour, testé:

$parts = array($one, $two, $three, $four); 
$reversed = array_reverse($parts); 

function getPath($ret, $n) { 
    global $parts; 
    foreach (range(0, $n) as $i) { 
     $ret = $ret[$parts[$i]]; 
    } 
    return $ret; 
} 

$error = false; 
foreach (range(0, count($reversed)) as $i) { 
    if (!$reversed[$i]) { 
     unset($reversed[$i]); 
     continue; 
    } 

    if (!getPath($navi, count($parts) - $i - 1)) { 
     $error = true; 
     break; 
    } 
} 

if ($error) { 
    echo "error!"; 
} else { 
    echo "/content/" . implode("/", array_reverse($reversed)) . ".php"; 
} 
0

Le problème est que vous utilisez isset(foo), ce qui rend difficile de mettre les variables dans un tableau. Si vous testez la longueur de la variable, utilisez alors:

$parts = array_reverse(array($one,$two,$three,$four)); 
foreach ($parts as $i => $value) 
    if(strlen($value)==0) 
     unset($array[$i]); 
$final = join('/',parts); 
if(isset($navi[$final])) echo "/content/" . $final . ".php"; 
else echo "\nerror\n\n\n"; 

Mais cela vous demandera de changer votre navi de $ construire pour ressembler

$navi['foo/bar/baz'] = "someval"; 

au lieu de

$navi['foo']['bar']['baz'] = "someval"; 

car nous utiliserons la chaîne concaténée $final pour rechercher dans le $ isset. Sinon, le seul chemin est généré php dynamiquement qui est horrible.

Pourriez-vous structurer vos données différemment? Le bouclage pour les dimensions du tableau n'est pas sympa, alors que la liste ci-dessus est beaucoup plus facile à réaliser.

0

Je pense qu'il y a des problèmes plus profonds avec votre code. Mais pour résoudre ce problème juste - il y a je pense:

$urls = array(); 
$tempNavi = $navi; 
foreach (array('one', 'two', 'three', 'four') as $var) { 
    if (!isset($$var) || !isset($tempNavi[$$var])) 
     break; 
    $tempNavi = $tempNavi[$$var]; 
    $urls[] = $$var; 
} 

if ($urls) { 
    echo '/content/' . implode('/', $urls); 
} else { 
    echo 'error'; 
} 
0

Une solution récursive, par souci d'exhaustivité:

function navi_recurse(&$navi, &$steps, $i = 0) { 
    if ($i < count($steps) - 1) { 
    $step = $steps[$i]; 
    if (isset($navi[$step])) 
     return navi_recurse($navi[$step], $steps, $i+1); 
    else 
     return "error\n"; 
    } 
    return '/content/'.implode('/', $steps).'.php'; 
} 

Appel comme ceci:

$steps = array($one, $two, $three, $four); 
echo navi_recurse($navi, $steps);