不正な文字列オフセット警告PHP


193

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)「print」の直前で変数を確認してください。
Skrol29 2012年

9
ほとんどの人が見逃したのは、これはインデックスが存在しないことを正確に意味するわけではありません-「未定義のインデックス」メッセージを生成します。これは別のエラーです。
grantwparks 2014

5
ここでの答えは、stackoverflow.com / a / 20271518/2898712です。
wedi

19
この質問を見ている人への注意:この質問への正しい答えはマークされたものではありません。正しいのは、以下のKzqaiです
アーロン、

回答:


37

この方法を試してください...私はこのコードをテストしました...それは動作します...

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

1
それを見つけた。ご協力いただきありがとうございます。var_dumpが役立ちました。このようなストレージのコンテンツが含まれている構成ファイルから配列をロードしました。array(2){["host"] => string(9) "127.0.0.1" ["port"] => string(5) "11211"} string(5) "m_prefix" PHP 5.4は$ xx [' host ']が警告を正しくスローしました。
thesonix 2012年

後に同じエラーが発生しましたinclude_once($file);。配列は正しく構築されていますが(デバッグ情報にはこれが示されています)、PHPの不正なstringoffset警告メッセージなしで使用できるようにするには、手動で別の配列にコピーする必要があります。
Franz Holzinger、2016

$ sStartDate = date( "Ymd"、strtotime($ feed ['DTSTART'] ['value'])); $ sEndDate = date( "Ymd"、strtotime($ feed ['DTEND'] ['value'])); ここで同じエラーを修正する方法警告:不正な文字列オフセット
J. Shabu

302

エラー 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 2017年

多次元配列の間違ったノードを取得しようとすると、このエラーが発生する場合があります。つまり、「深すぎる」​​場合、代わりに選択の親が必要です
zoltar

これは正しいです。fetchAll(PDO::FETCH_ASSOC)代わりに使用fetch(PDO::FETCH_ASSOC)して完全に動作しました。
MNN

誤って、エラーメッセージの原因$variablename = [];$variablename = "test";なったコードの別の部分で同じコードを2回使用しています。
Kai Noack

77

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' 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ます。arrayor があるかどうかわからない場合はstring、少しトリッキーになります。

私たちができることは、is_arrayand issetやorのようなものに関する通知、警告、エラーがないことを確認するためのあらゆる種類のチェックです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

これは配列とどのように関係していますか?
一部の非記述子ユーザー


1

私の場合、mysql_fetch_assocをmysql_fetch_arrayに変更して解決します。解決するのに3日かかります:-(そして私のプロジェクトの他のバージョンはfetch 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の例なので、他の言語で配列が空かどうかを確認する方法を調べてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.