非法字符串偏移警告PHP

时间:2012-03-26 08:55:03

标签: php warnings

将我的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并重新设置错误级别。

16 个答案:

答案 0 :(得分:245)

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

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

$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

对于那些试图将错误的模糊性转化为关于它的事情的人来说,就像我一样。

答案 1 :(得分:65)

TL; DR

您尝试访问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'作为字符串的偏移量。像这样:

$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。如果我们不知道我们是否有arraystring,事情会变得有点棘手。

我们可以做的是各种检查,以确保我们不会发出is_arrayisset或{{{{{{}} {}}的通知,警告或错误3}}:

$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
}

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

答案 2 :(得分:37)

请尝试这种方式....我已经测试了这段代码....它有效......

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

答案 3 :(得分:10)

这里有很多很棒的答案 - 但我发现我的问题相当简单。

我试图运行以下命令:

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

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

$x = array();

并且有效。

答案 4 :(得分:4)

从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

答案 5 :(得分:4)

问题有点晚了,但对于正在搜索的其他人:我通过使用错误的值(类型)初始化来解决此错误:

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

正确的方法是:

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

只是因为它有助于任何人,我收到此错误是因为我忘了反序列化序列化数组。这肯定是我会检查它是否适用于你的情况。

答案 9 :(得分:0)

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

在我的情况下,我有:

$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';
}

答案 10 :(得分:0)

在我的情况下,当我改变 sql 查询的功能时,我解决了它 之后:return json_encode($array) 然后:return $array

答案 11 :(得分:0)

它对我有用:

我的测试代码:

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

输出:55

检查它。谢谢

答案 12 :(得分:0)

只需使用

$memcachedConfig = array();

之前

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


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

这是因为您从未定义过什么是$ memcachedConfig,因此默认情况下将其视为字符串而不是数组。

答案 13 :(得分:0)

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

所以让我们尝试

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

我希望这会对您有所帮助。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

对于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,因此请找出如何检查其他语言中的数组是否为空。