为什么这个脚本不会将数组识别为数组?

时间:2013-07-01 14:51:35

标签: php arrays associative-array

我用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。 但是当我将函数调用为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识别为数组。 为什么呢?

提前谢谢

5 个答案:

答案 0 :(得分:3)

问题与scope of the variables有关,您需要首先将其标识为全球。

更改此功能:

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

答案 1 :(得分:3)

$menuen/$menuit超出了函数的范围。你可以做两件事之一。

使用global

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

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

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

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

第二种是首选方法。

答案 2 :(得分:2)

所以,每个人都建议你定义全局变量......现在,看看你想要实现的目标,就是本地化的东西。

假设你已经决定编写自己的(原因不明; goto 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;
    }
}

答案 3 :(得分:1)

你不能只在函数中使用全局变量,你必须这样做:

function getName ($link) {
    global $menuen, $menuit;
    if ($lang === "en") {
    .....

答案 4 :(得分:0)

你应该写

global $menuen;

在函数定义之后,如果你想以这种方式运行它。