2

这是一段我认为不是很“漂亮”的 PHP 代码,我敢肯定它可以用for什么来简化它。我正在尝试找到适用于此的算法,但我无法弄清楚,请帮助我。

这是代码:

if(isset($4))
{
 if(isset($navi[$one][$two][$three][$four])) echo "/content/" 。一美元。“/”。两美元。“/”。三美元。"/" .$4 . ".php";
 否则回显“错误”;
}
否则 if(isset($3))
{
 if(isset($navi[$one][$two][$three])) echo "/content/" 。一美元。“/”。两美元。“/”。三美元。".php";
 否则回显“错误”;
}
否则 if(isset($2))
{
 if(isset($navi[$one][$two])) echo "/content/" 。一美元。“/”。两美元。".php";
 否则回显“错误”;
}
否则 if(isset($one))
{
 if(isset($navi[$one]))echo "/content/" 。一美元。".php";
 否则回显“错误”;
}
别的
{
 回声“错误”;
}

谢谢!

4

4 回答 4

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";
}
于 2010-06-15T10:27:14.360 回答
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);
于 2010-06-15T10:48:28.850 回答
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,这太可怕了。

你能以不同的方式组织你的数据吗?数组维度的循环并不好,而上面的平面列表更容易完成。

于 2010-06-15T10:28:56.393 回答
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';
}
于 2010-06-15T10:36:10.430 回答