非法字符串偏移警告PHP

我得到一个奇怪的PHP错误后更新我的PHP版本到5.4.0-3。

我有这样一个数组:

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

960961 次浏览

请尝试这种方式....我已经测试了这个代码....它的工作原理……

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

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 < / p >

对于那些遇到这个问题试图将错误的模糊性转化为解决它的方法的人,就像我一样。

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

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

你试图访问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。如果我们不知道是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只会检查,好吧,键存在

在我的情况下,我把mysql_fetch_assoc改为mysql_fetch_array并解决。它需要3天来解决:-(和我的项目的其他版本运行fetch assoc。

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

我试图运行以下命令:

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

并且我在$x['name']上得到这个illegal string错误,因为我没有首先定义数组。因此,在尝试将对象赋值给$x[]之前,我加入了下面这行代码:

$x = array();

这招奏效了。

从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

只是以防它帮助任何人,我得到这个错误,因为我忘记反序列化一个序列化的数组。如果这适用于你的情况,我肯定会检查一下。

这是一个旧的,但如果有人能从中受益。 如果数组为空,也会得到这个错误。< / p >

在我的情况下,我有:

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

在我的情况下,我解决它时,我改变了函数,执行sql查询 后:return json_encode($array) 那么:return $array

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

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

正确的做法是:

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

这对我来说很管用:

我的测试代码:

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

输出:55

看看吧,伙计们。谢谢

只使用

$memcachedConfig = array();

之前

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




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

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

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

让我们试试

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

我希望这对你有所帮助。

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

为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的,看看如何在其他语言中检查数组是否为空

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