非法字符串偏移量警告PHP


191

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


20
显然$memcachedConfig不是那个数组。演出var_dump($memcachedConfig);
zerkms 2012年

1
这意味着密钥不存在。var_export($memcachedConfig)在“打印”之前检查变量。
Skrol29年

9
大多数人错过的是,这并不完全意味着索引不存在-会生成“未定义的索引”消息。这是一个不同的错误。
Grantwparks 2014年

4
stackoverflow.com/a/20271518/2898712是此处的正确答案。
wedi

18
注意任何人在查看此问题:此问题的正确答案不是标记的;正确的是下面的Kzqai
Aaron

Answers:


37

请尝试这种方式。...我已经测试了此代码。

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

1
找到了。谢谢你的帮助。var_dump帮助。我从配置文件加载了数组,该文件具有这样的临时内容。array(2){[“主机”] =>字符串(9)“ 127.0.0.1” [“端口”] =>字符串(5)“ 11211”}字符串(5)“ m_prefix” PHP 5.4现在$ xx ['主持人”]正确地发出了警告。
thesonix 2012年

发生错误后,我遇到了相同的错误include_once($file);。该数组已正确构建(调试信息显示了此信息),但是必须在没有PHP非法stringoffset警告消息的情况下将其手动复制到另一个数组中。
Franz Holzinger

$ sStartDate = date(“ Ymd”,strtotime($ feed ['DTSTART'] ['value'])); $ sEndDate = date(“ Ymd”,strtotime($ feed ['DTEND'] ['value']));; 如何在此处修复相同的错误警告:字符串偏移量非法
J.Shabu

301

错误 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

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


8
我敢打赌,这可以证明这是原始问题发生的原因。大多数评论错误地认为“未定义索引”是错误。
Grantwparks 2014年

1
在while循环中遇到这个问题。谢谢
David Okwii

有时,当尝试获取多维数组的错误节点时可能会发生此错误,即“太深”,而您需要选择的父级
zoltar,

这是正确的,我fetchAll(PDO::FETCH_ASSOC)改用了,fetch(PDO::FETCH_ASSOC)并且运行良好。
MNN

偶然地,我$variablename = [];在代码的另一部分使用了两次相同的代码,$variablename = "test";从而导致了错误消息。
Kai Noack

77

TL; DR

您正在尝试访问a string就像它是一个数组一样,键是a 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。如果我们不知道是否会有arrayor或string,则事情会变得有些棘手。

我们可以做的是各种检查,以确保我们不会在诸如is_arrayand isset或诸如此类的情况下收到通知,警告或错误array_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
}

isset和之间有一些细微的差异array_key_exists。例如,如果值$array['key']nullisset返回falsearray_key_exists只会检查密钥是否存在


13

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

我正在尝试运行以下命令:

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

而且我得到这个illegal string错误是$x['name']因为我没有首先定义数组。因此,在尝试将内容分配给之前,我放入了以下代码行$x[]

$x = array();

而且有效。


1
我认为这应该是答案。这必须是5.4(与7之前的值)和7之间的区别
。– sonnb

7

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

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

正确的方法是:

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

如果$ varName是从应为数组但可以为空字符串的值初始化的,则强制使用该值可以避免这种情况,例如:$ varName =(array)$ shouldBeArray
markdwhite

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

这与数组有什么关系...?
某些非描述用户

2

在检查阵列之前,请执行以下操作:

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

1

就我而言,我将mysql_fetch_assoc更改为mysql_fetch_array并解决。解决问题需要3天时间:-(和其他版本的proyect都使用访存assoc运行。



1

它对我有用:

我的测试代码:

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

输出: 55

伙计们。谢谢


1

只是使用

$memcachedConfig = array();

之前

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


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

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


1

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

所以让我们尝试

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

我希望这能帮到您。


0

以防万一它对任何人都有帮助,我得到这个错误是因为我忘记了对序列化数组进行反序列化。我绝对会检查是否适用于您的情况。


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

0

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


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.