2010-06-15 48 views
2

這裏有一段PHP代碼,我認爲它不是很「漂亮」,我敢肯定它可以用for或其他東西簡化它。我試圖找到和算法,這將工作,但我不明白,請幫助我。PHP:用算法簡化?

下面的代碼:

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"; 
}

謝謝!

回答

2

更新,測試:

$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

的問題是,你正在使用isset(foo),這使得它很難把這些變量放到一個數組。如果測試變量會做的長度,然後用:

$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"; 

但是,這將要求您更改$ NAVI構造看起來像

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

,而不是

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

因爲我們將使用連接的字符串$final在$ isset中查找。否則唯一的路線是動態生成的PHP,這是可怕的。

你可以用不同的方式構造你的數據嗎?循環陣列尺寸並不好,而上面的扁平列表要容易得多。

0

我認爲你的代碼存在更深層次的問題。但要解決眼前這個問題 - 有我的猜測:

$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

一個遞歸解決方案,爲完整起見:

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'; 
} 

這樣調用:

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