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超出了函数的范围。你可以做两件事中的一件。

使用global

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

将变量作为函数参数传递:

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

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

第二种是首选方法。

于 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 回答