Php 为什么赢了';这个脚本不能将数组识别为数组吗?
我用PHP编写了这个脚本:Php 为什么赢了';这个脚本不能将数组识别为数组吗?,php,arrays,associative-array,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($men
$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。
但是当我调用函数如asgetName(“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识别为数组。
为什么?
提前谢谢你你应该写信
global $menuen;
在函数定义之后,如果您想以这种方式运行它。您不能只在函数中使用全局变量,您必须这样做:
function getName ($link) {
global $menuen, $menuit;
if ($lang === "en") {
.....
问题与有关,您需要首先将其标识为全局
更改此函数的功能:
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));
}
}
}
$menuen/$menuit
不在函数范围内。你可以做两件事中的一件
使用全局:
function getName ($link) {
global $menuen,$menuit;
....
}
将变量作为函数参数传递:
function getName ($link,$menuen,$menuit) {
....
}
getName($link,$menuen,$menuit);
第二种是首选方法。因此,每个人都建议您定义全局变量。。。现在,看看你想要实现什么,这是本地化的东西
假设您已决定编写自己的(原因未知;转到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;
}
}
您需要打开错误报告设置以同时显示E_通知级别的错误。@Agantacroxi-请参阅下面我的回答。对于您实际想要实现的目标,全局建议并不是一个很好的解决方案。第二种方法绝对是首选。使用globals似乎很便宜。传入所需的参数,或者最好将它们作为单个参数数组传入。$link每次都会更改。我不能每次都使用if/ifelse语句(我必须使用该函数大约80次),我不确定您是否理解$链接与if/else无关-if-else用于该语言。。。您当前的解决方案对于您试图实现的目标来说非常糟糕,您应该阅读有关编程的枯燥原则…对。我就是这么说的。我不会对语言使用if/else语句80次,对吗?@Agantacroxi-无论如何,你都在这么做。我不确定你是否理解我的代码。只有当/否则语言不是链接时,您才可以访问。事实上,我想说,我的代码可能比其他答案更接近于枯燥的原则,而这些答案大多都建议纠正糟糕的软件design@Agantacroxi-要记住的一般原则是:;如果变量不需要在整个应用程序中持久化;它不应该是全球性的。下面是一个关于全局的好帖子,你应该读到: