当前位置: 首页 > 知识库问答 >
问题:

为什么这个脚本不能将数组识别为数组?[副本]

李鸿
2023-03-14

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

提前谢谢你


共有3个答案

刘博文
2023-03-14

所以,每个人都建议你定义全局...现在,看了看你试图实现的目标,这是本地化的东西。

假设你已经决定写你自己的(出于未知的原因;去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;
    }
}
山凌
2023-03-14

问题与变量的范围有关,您需要首先将其标识为全局变量。

更改此函数的功能:

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));
        }
    }
}
濮阳君浩
2023-03-14

$menuen/$menuit不在函数范围内。你可以做两件事中的一件。

使用全局

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

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

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

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

二是优选方法。

 类似资料:
  • 我遵循这个教程: https://www.w3schools.com/php/php_xml_dom.asp 循环遍历XML部分是有问题的。出于某种原因,PHP将DOM对象视为数组。此外,var_dump除了长度之外,不返回任何关于对象属性的信息,但程序输出看起来像是不知从何而来。foreach可以通过某种方式循环对象吗?如果有,这些属性(节点名和节点值)包含在哪里,因为var_dump没有显示它

  • 在C中不使用sizeof查找数组大小的问题中,asker将int数组视为int数组的数组,方法是获取地址,然后指定数组索引为1:

  • 它将把牌阵的一半分配给玩家和计算机(玩家得到前半部分,计算机得到后半部分)。现在这是先洗牌,所以是的,这似乎是公平的。 我得到的出界错误是这一行:

  • 但是,正确的数据条目在被调用时会打印出来。我试着在网上寻找我应该做什么的答案,但我找不到任何实际可行的东西。我刚刚开始学习Java,所以可能有一个非常简单的答案,我只是忽略了。如果有人有什么想法,我将不胜感激。

  • 我想做的很简单。将这个包含json对象的数组解析为Javascript数组。 但是unicode字符\u003C似乎破坏了解析器。在chrome控制台中,我看到“UncaughtSyntaxerror:意外令牌” 多一点信息。以上是代码的计算结果。实际上,代码包含一个jsp表达式。 如果我删除单引号,没有问题,但是eclipse给我一个“丢失分号”的错误消息。是否可以解析数组与引号,因为我试图做的