【问题标题】:Illegal string offset Warning PHP非法字符串偏移警告 PHP
【发布时间】:2012-04-09 18:44:33
【问题描述】:

将我的 php 版本更新到 5.4.0-3 后,我收到一个奇怪的 PHP 错误。

我有这个数组:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

当我尝试像这样访问它时,会收到奇怪的警告

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

我真的不想只编辑我的 php.ini 并重新设置错误级别。

【问题讨论】:

  • 显然$memcachedConfig 不是那个数组。显示var_dump($memcachedConfig);
  • 表示key不存在。在“打印”之前使用var_export($memcachedConfig) 检查您的变量。
  • 大多数人错过的是,这并不完全意味着索引不存在——它会产生“未定义索引”消息。这是一个不同的错误。
  • stackoverflow.com/a/20271518/2898712 是这里的正确答案。
  • 查看此问题的人请注意:此问题的正确答案不是标记的;正确的是 Kzqai 的下面

标签: php warnings


【解决方案1】:

错误Illegal string offset 'whatever' in... 通常表示:您正在尝试将字符串用作完整数组。

这实际上是可能的,因为字符串在 php.ini 中可以被视为单个字符的数组。所以你认为 $var 是一个带有键的数组,但它只是一个带有标准数字键的 string,例如:

$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error

您可以在此处查看此操作: http://ideone.com/fMhmkR

对于那些试图将错误的模糊性转化为可以解决的问题的人,就像我一样。

【讨论】:

  • 我敢打赌,这可以证明这是最初问题发生的原因。大多数 cmets 错误地认为“未定义的索引”是错误。
  • 在 while 循环中遇到了这个问题。谢谢
  • 有时在尝试抓取多维数组的错误节点时可能会发生此错误,即“太深”,您需要选择的父节点
  • 这是正确的,我用fetchAll(PDO::FETCH_ASSOC) 代替fetch(PDO::FETCH_ASSOC) 并且工作得很好。
  • 意外地,我两次使用相同的$variablename = [];,在我的代码的另一部分使用$variablename = "test";,这导致了错误消息。
【解决方案2】:

您正在尝试访问string,就像它是一个数组一样,其键是stringstring 不会理解。在代码中我们可以看到问题:

"hello"["hello"];
// PHP Warning:  Illegal string offset 'hello' in php shell code on line 1

"hello"[0];
// No errors.

array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.

深入

让我们看看那个错误:

警告:非法字符串偏移 'port' in ...

它说什么?它说我们正在尝试使用字符串'port' 作为字符串的偏移量。像这样:

$a_string = "string";

// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...

// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...

是什么原因造成的?

由于某种原因,您期望的是array,但您却拥有string。只是混搭。也许你的变量被改变了,也许它从来都不是array,这真的不重要。

可以做什么?

如果我们知道我们应该有一个array,我们应该做一些基本的调试来确定为什么我们没有一个array。如果我们不知道是array 还是string,事情就会变得有点棘手。

我们可以做的是各种检查,以确保我们没有通知、警告或错误,例如 is_arrayissetarray_key_exists

$a_string = "string";
$an_array = array('port' => 'the_port');

if (is_array($a_string) && isset($a_string['port'])) {
    // No problem, we'll never get here.
    echo $a_string['port'];
}

if (is_array($an_array) && isset($an_array['port'])) {
    // Ok!
    echo $an_array['port']; // the_port
}

if (is_array($an_array) && isset($an_array['unset_key'])) {
    // No problem again, we won't enter.
    echo $an_array['unset_key'];
}


// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
    // Ok!
    echo $an_array['port']; // the_port
}

issetarray_key_exists 之间存在一些细微差别。例如,如果$array['key'] 的值为null,则isset 返回falsearray_key_exists 只会检查密钥是否存在

【讨论】:

    【解决方案3】:

    请尝试这种方式....我已经测试过这段代码....它可以工作....

    $memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
    print_r($memcachedConfig['host']);
    

    【讨论】:

    • 找到了。谢谢你的帮助。 var_dump 有帮助。我从一个配置文件中加载了数组,该文件具有这样的策略内容。 array(2) { ["host"]=> string(9) "127.0.0.1" ["port"]=> string(5) "11211" } string(5) "m_prefix" PHP 5.4 现在 $xx[' host'] 正确抛出警告。
    • include_once($file); 之后我遇到了同样的错误。该数组已正确构建(调试信息显示了这一点),但是必须手动将其复制到另一个数组中才能使用,而不会出现 PHP 非法字符串偏移警告消息。
    • $sStartDate = date("Y-m-d",strtotime($feed['DTSTART']['value'])); $sEndDate = date("Y-m-d", strtotime($feed['DTEND']['value']));如何在此处修复相同的错误警告:非法字符串偏移
    • 如何解释为什么这有效以及为什么 OP 的代码无效?像这样的答案是人们对 Stack Overflow 持怀疑态度的主要原因,尽管有很多人愿意在他们的答案中解释每一个细节,并实际上创造了一些有用且具有教育意义的内容。
    【解决方案4】:

    这里有很多很好的答案 - 但我发现我的问题要简单得多。

    我试图运行以下命令:

    $x['name']   = $j['name'];
    

    我在$x['name'] 上收到了这个illegal string 错误,因为我没有先定义数组。所以我在尝试将事物分配给$x[]之前放入以下代码行:

    $x = array();
    

    它成功了。

    【讨论】:

    • 我认为这应该是答案。这必须是 5.4(以及 7 之前的版本)和 7 之间的差异。
    【解决方案5】:

    这个问题有点晚了,但是对于正在搜索的其他人:我通过使用错误的值(类型)进行初始化而得到了这个错误:

    $varName = '';
    $varName["x"] = "test"; // causes: Illegal string offset
    

    正确的做法是:

     $varName = array();
     $varName["x"] = "test"; // works
    

    【讨论】:

    • $varName 是从一个应该是数组但可能是空字符串的值初始化的,强制该值可以避免这种情况,例如:$varName = (array) $shouldBeArray
    【解决方案6】:

    从 PHP 5.4 开始,我们需要传递函数期望的相同数据类型值。例如:

    function testimonial($id); // This function expects $id as an integer
    

    调用此函数时,如果提供了这样的字符串值:

    $id = $array['id']; // $id is of string type
    testimonial($id); // illegal offset warning
    

    由于数据类型不匹配,这将生成非法偏移警告。为了解决这个问题,你可以使用settype

    $id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
    testimonial($id); // now running smoothly
    

    【讨论】:

    • 这与数组有什么关系...?
    【解决方案7】:

    在检查数组之前,请执行以下操作:

    if(!is_array($memcachedConfig))
         $memcachedConfig = array();
    

    【讨论】:

      【解决方案8】:

      在我的情况下,我将 mysql_fetch_assoc 更改为 mysql_fetch_array 并解决。解决需要 3 天 :-( 并且我的项目的其他版本使用 fetch assoc 运行。

      【讨论】:

        【解决方案9】:

        在我的情况下,我在更改执行 sql 查询的函数时解决了这个问题 之后:return json_encode($array) 然后:return $array

        【讨论】:

          【解决方案10】:

          对我有用:

          我的测试代码:

          $var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
          foreach($var2 as $result)
          {  
              $test = $result['c'];
          }
          print_r($test);
          

          输出:55

          检查一下伙计们。谢谢

          【讨论】:

            【解决方案11】:

            只需使用

            $memcachedConfig = array();
            

            之前

             print $memcachedConfig['host'];
             print $memcachedConfig['port'];
            
            
             Warning: Illegal string offset 'host' in ....
             Warning: Illegal string offset 'port' in ....
            

            这是因为你从来没有定义什么是 $memcachedConfig,所以默认情况下被字符串而不是数组处理..

            【讨论】:

              【解决方案12】:

              我通过使用 trim() 函数解决了这个问题。问题在于空间。

              让我们试试

              $unit_size = []; //please declare the variable type 
              $unit_size = exolode("x", $unit_size);
              $width  = trim ($unit_size[1] );
              $height = trim ($unit_size[2] );
              

              希望对你有帮助。

              【讨论】:

                【解决方案13】:

                我认为这条消息的唯一原因是因为目标数组实际上是一个类似字符串等的数组 (JSON -> {"host": "127.0.0.1"}) 变量

                【讨论】:

                  【解决方案14】:

                  对于 PHP

                  //Setup Array like so
                  $memcachedConfig = array(
                    "host" => "127.0.0.1",
                    "port" => "11211"
                  );
                  
                  //Always a good practice to check if empty
                  
                  if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){
                  
                      //Some codes
                  
                      print_r ($memcachedConfig['host']);
                      print_r ($memcachedConfig['port']);
                  
                  }
                  

                  只需确保检查返回的值不为空。 所以这个例子是针对 PHP 的,所以了解如何在其他语言中检查数组是否为空。

                  【讨论】:

                    【解决方案15】:

                    万一它对任何人都有帮助,我收到此错误是因为我忘记反序列化序列化数组。这绝对是我会检查它是否适用于你的情况。

                    【讨论】:

                      【解决方案16】:

                      这是一个旧的,但万一有人可以从中受益。 如果您的数组为空,您也会收到此错误。

                      就我而言,我有:

                      $buyers_array = array();
                      $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
                      ...
                      echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
                      

                      我改成了:

                      $buyers_array = array();
                      $buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
                      ...
                      if(is_array($buyers_array)) {
                         echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
                      } else {
                         echo 'Buyers id ' . $this_buyer_id . ' not found';
                      }
                      

                      【讨论】:

                        【解决方案17】:

                        在我的情况下:在获取数据库记录时确保使用 result_array(); 而不是 row();row_array();

                        【讨论】:

                          猜你喜欢
                          • 2013-04-11
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-05-21
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多