我用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识别为数组。 为什么呢?
提前谢谢
答案 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;
在函数定义之后,如果你想以这种方式运行它。