2

これは私があまり「きれい」ではないと思うPHPコードの一部です。それをfor何かで単純化することは可能だと確信しています。これに役立つアルゴリズムを見つけようとしていますが、わかりません。助けてください。

コードは次のとおりです。

if(isset($ four))
{{
 if(isset($ navi [$ one] [$ two] [$ three] [$ four]))echo "/content/"。$one。"/"。$two。"/"。$3。"/"。$four。".php";
 それ以外の場合は「エラー」をエコーし​​ます。
}
else if(isset($ three))
{{
 if(isset($ navi [$ one] [$ two] [$ three]))echo "/content/"。$one。"/"。$two。"/"。$3。".php";
 それ以外の場合は「エラー」をエコーし​​ます。
}
else if(isset($ two))
{{
 if(isset($ navi [$ one] [$ two]))echo "/content/"。$one。"/"。$two。".php";
 それ以外の場合は「エラー」をエコーし​​ます。
}
else if(isset($ one))
{{
 if(isset($ navi [$ one]))echo "/content/"。$one。".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

あなたのコードにはもっと深い問題があると思います。しかし、この問題を解決するために-私の推測があります:

$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 に答える
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 に答える