繁体   English   中英

非法字符串偏移警告 PHP

[英]Illegal string offset Warning PHP

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

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

对于那些试图将错误的模糊性转化为对它做些什么的人来回答这个问题,就像我一样。

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

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

我们可以做的是各种检查,以确保我们没有像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返回false array_key_exists只会检查密钥是否存在

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

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

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

我试图运行以下命令:

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

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

$x = array();

它奏效了。

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

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

正确的方法是:

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

从 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

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

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

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

就我而言,当我更改执行sql查询的函数时,我解决了这个问题: return json_encode($array)然后: return $array

它对我有用:

我的测试代码:

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

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

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

就我而言,我有:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM