0

私はPHPでこのスクリプトを書きました:

$menuen = array(
    "didattica" => "program",
    "procedure" => "policies",
    "news" => "news",
);
$menuit = array(
    ...
);
function getName ($link) {
    if ($lang === "en") {
        if (in_array($link, array_keys($menuen))) {
            return $menuen[$link];
        }
        else {
            return ucfirst(str_replace("_", " ", $link));
        }
    }
    else {
        if (in_array($link, array_keys($menuit))) {
            return $menuit[$link];
        }
        else {
            return ucfirst(str_replace("_", " ", $link));
        }
    }
}

$lang は en です。しかし、 as のような関数を呼び出すとgetName("didattica");、スクリプトは次のエラーをスローします。

Warning:  array_keys() expects parameter 1 to be array, null given in [script path] on line [if (in_array($link, array_keys($menuen))) {]

Warning:  in_array() expects parameter 2 to be array, null given in [script path] on line [if (in_array($link, array_keys($menuen))) {]

したがって、スクリプトは $menuen を配列として認識しません。なんで?

前もって感謝します

4

5 に答える 5

3

問題は変数のスコープに関連しています。最初にグローバルとして識別する必要があります。

この関数を次のように変更します。

function getName ($link) {
    global $menuen,$menuit;

    if ($lang === "en") {
        if (in_array($link, array_keys($menuen))) {
            return $menuen[$link];
        }
        else {
            return ucfirst(str_replace("_", " ", $link));
        }
    }
    else {
        if (in_array($link, array_keys($menuit))) {
            return $menuit[$link];
        }
        else {
            return ucfirst(str_replace("_", " ", $link));
        }
    }
}
于 2013-07-01T14:54:24.933 に答える
3

$menuen/$menuit関数の範囲外です。できることは 2 つのうちの 1 つです。

使用global:

function getName ($link) {
    global $menuen,$menuit;
    ....
}

変数を関数パラメーターとして渡します。

function getName ($link,$menuen,$menuit) {
    ....
}

getName($link,$menuen,$menuit);

2 番目の方法が推奨されます。

于 2013-07-01T14:54:48.830 に答える
2

それで、誰もがグローバルを定義することを提案しました...今、あなたが達成しようとしていることを見て、それはローカリゼーションのものです。

自分で作成することに決めたと仮定すると (理由は不明です。phpclasses.org にアクセスすると、これを行うための何百万ものローカライズ スクリプトが見つかります)、次のことをお勧めします。

$menuen = array(
    "didattica" => "program",
    "procedure" => "policies",
    "news" => "news",
);
$menuit = array(
    ...
);
$lang = $_GET['lang']; // Just an example of how the lang would be set

if ($lang == 'en') {
    $link_name = getName($link, $menuen);
elseif ($lang == 'it') {
    $link_name = getName($link, $menuit);
.... // Also suggest using switch if it's a defined list; or perhaps a better array to hold all of them.

function getName ($link, $menu) {
    if (in_array($link, array_keys($menu))) {
        return $menu[$link];
    }
    else {
        return ucfirst(str_replace("_", " ", $link));
    }
}

このように、コードの重複はほとんどなく、完全に再利用可能です。

[編集:さらに良いアプローチ]

$menues = array (
    "en" => array (
        "didattica" => "program",
        "procedure" => "policies",
        "news" => "news",
    ),
    "it" => array (
        "didattica" => "...",
        "procedure" => "...",
        "news" => "...",
    ),
);

$lang = 'it';
$link = 'news';

$link_name = getName($link, $menues, $lang);

if ($link_name === false ) {
    echo "Language not defined";
}

echo $link_name;

function getName ($link, $menues, $lang) {
    if (in_array($lang, array_keys($menues))) {
      if (in_array($link, array_keys($menues[$lang]))) {
          return $menues[$lang][$link];
      }
      else {
          return ucfirst(str_replace("_", " ", $link));
      }
}
else {
        return false;
    }
}
于 2013-07-01T15:04:03.957 に答える
1

関数でグローバルを使用することはできません。次のようにする必要があります。

function getName ($link) {
    global $menuen, $menuit;
    if ($lang === "en") {
    .....
于 2013-07-01T14:54:16.373 に答える
0

あなたは書くべきです

global $menuen;

この方法で実行したい場合は、関数定義の後。

于 2013-07-01T14:54:13.643 に答える