Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么赢了';这个脚本不能将数组识别为数组吗?_Php_Arrays_Associative Array - Fatal编程技术网

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

我用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识别为数组。 为什么?

提前谢谢你

你应该写信

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-要记住的一般原则是:;如果变量不需要在整个应用程序中持久化;它不应该是全球性的。下面是一个关于全局的好帖子,你应该读到: