【问题标题】:Why won't this script recognize an array as an array? [duplicate]为什么此脚本不能将数组识别为数组? [复制]
【发布时间】:2013-06-28 17:54:06
【问题描述】:

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

提前谢谢你

【问题讨论】:

  • 您需要将错误报告设置设置为也显示 E_NOTICE 级别的错误。
  • @Agantacroxi - 请参阅下面的回复。对于您实际想要实现的目标,全局建议并不是一个很好的解决方案。

标签: php arrays associative-array


【解决方案1】:

你应该写

global $menuen;

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案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));
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        $menuen/$menuit 超出了函数的范围。您可以做 2 件事中的 1 件事。

        使用global:

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

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

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

        第二种是首选方法。

        【讨论】:

        • 第二种方法绝对是首选。使用全局变量似乎很便宜。传入你需要的参数,或者最好将它们作为单个参数数组传入。
        【解决方案5】:

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

        假设您已决定自己编写(原因未知;转到 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;
            }
        }
        

        【讨论】:

        • $link 每次都会改变。我不能每次都放 if/ifelse 语句(我必须使用该函数有点像 80 次)
        • 我不确定您是否理解... $link 与 if/else 无关 - if else 与语言有关...您当前的解决方案对于您现在的情况来说很糟糕尝试实现,您应该阅读有关编程的 DRY 原则...
        • 对。这就是我要说的。我不会为语言添加 if/else 语句 80 次,对吧?
        • @Agantacroxi - 好吧,无论如何你都在这样做。我不确定你是否理解我的代码。你只有当/否则语言不是链接。事实上,我会说我的代码可能比任何其他答案更接近 DRY 原则,这些答案大多表明对糟糕的软件设计的纠正
        • @Agantacroxi - 要记住的一般原则是;如果一个变量不需要在整个应用程序中持久化;它不应该是一个全球性的。这是一篇关于全局变量的好文章,您应该阅读:stackoverflow.com/questions/2216340/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多