【问题标题】:What's wrong with my PHP array?我的 PHP 数组有什么问题?
【发布时间】:2009-04-13 03:21:44
【问题描述】:
    $genreList;

    function directorGen($array)
    {
        foreach($array as $value)
        {
          $genreList[] = $value;    
        }
    }

   //later..

   directorGen($title->genres());

此代码生成一个 NULL 数组。如果我将 $genreList[] = $value 替换为 echo $value ,一切都会按预期打印出来。有什么想法吗?

【问题讨论】:

    标签: php arrays foreach


    【解决方案1】:

    如果$genreList 是一个全局变量,那就是你的问题:这是一个范围问题。它可以通过以下方式轻松修复:

    $genreList = array();
    
    function directorGen($array) {
        global $genreList;
        foreach($array as $value) {
            $genreList[] = $value;        
        }
    }
    

    注意:虽然不是绝对必要的,但我也对其进行了初始化,我认为这是一种很好的做法。

    如果directorGen() 是成员函数,$genreList 是数据成员,则更改为:

    function directorGen($array) {
        foreach($array as $value) {
            $this->genreList[] = $value;        
        }
    }
    

    【讨论】:

      【解决方案2】:

      $genreList 在哪里定义?它可能只是一个函数局部变量,在这种情况下,它会在函数退出时丢失。如果是类级别的变量,记得改用$this->genreList

      编辑

      我的错。如果它是一个全局变量,你需要将它添加到函数的顶部,以便 PHP 找到它:

      global $genreList;
      

      【讨论】:

      • 是的,我们知道这不是 OO 代码,但变量/数组(全局/本地)的范围是 PHP 的基础,不仅与 OO 相关,还有 PHP 的整个概念......
      【解决方案3】:

      这是一个范围问题。 directorGen() 中的 $genreList 只存在于 directorGen() 中,它并不是隐含的全局变量,因为它在函数之外被提及。尝试在函数顶部使用global $genreList

      【讨论】:

      • 很有趣,考虑到您接受的答案在函数顶部添加了一个全局声明。
      【解决方案4】:

      以下任何一项都可以解决您的问题;

      $genreList[] .= $value; // Appends each value to the array. 
      
      array_push($genreList, $value);
      

      也是我的错误,您应该通过以下语句从函数返回genreList:

      return $genreList;
      

      使用 global 关键字通常被认为是一种代码异味,因为它会在跟踪全局变量的使用情况以及它的值发生变化时产生许多问题。

      【讨论】:

      • 第一行代码中的字符串连接运算符是多余的。
      【解决方案5】:
      function directorGen($array)
      {
          $genreList = array();
      
          foreach($array as $value)
          {
              $genreList[] = $value;        
          }
      
          return $genreList;
      }
      

      //稍后..

      directorGen($title->genres());

      您将始终收到数组。甚至是空的。而且你不需要用 is_array() 函数检查它。

      【讨论】:

        【解决方案6】:

        这可能是你想要做的:

        class Test {
            //public, protected, private ...
            var $genreList = array();
        
            function directorGen(array $array) {
                //remove string keys
                $values = array_values($array);
                $this->genreList = array_merge($this->genreList, $values);
            }
        }
        

        注意:将重置计数器。如果您取消设置值然后添加新值,键将被重置为最低为 0,最大值为计数 - 1。

        【讨论】:

          猜你喜欢
          • 2013-06-29
          • 1970-01-01
          • 2018-08-19
          • 2014-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-26
          相关资源
          最近更新 更多