web-dev-qa-db-ja.com

無効な文字列オフセット 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を編集してエラーレベルを再設定したくはありません。

163
thesonix

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

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

エラーIllegal string offset 'whatever' in...は、一般的に次のような意味です。文字列を完全な配列として使用しようとしています。

文字列はphpの単一の文字の配列として扱うことができるので、それは実際に可能です。それで、あなたは$ varがキーを持つ配列だと思っています、しかしそれは標準の数字キーを持つ単なる string です、例えば:

$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

私がそうであったように、エラーのあいまいさをそれについて何かをすることに変換しようとしているこの質問に来る人々のために。

243
Kzqai

TL、DR

あなたは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.

詳細に

そのエラーを見てみましょう。

Warning:不正な文字列オフセット 'port'が...に含まれています.

それは何を言いますか?文字列のオフセットとして文字列'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ではなかった、それは本当に重要ではありません。

何ができる?

もしknowを持っているべきならarrayを持っているべきです、なぜ私たちはarrayを持っていないかを決定するためにいくつかの基本的なデバッグをするべきです。 arraystringのどちらがあるのか​​わからない場合、状況は少し複雑になります。

canが行うことは、 is_arrayisset または 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
}

issetarray_key_exists の間には微妙な違いがいくつかあります。たとえば、$array['key']の値がnullの場合、issetfalseを返します。 array_key_existsはキー 存在 をチェックするだけです。

65
Jon Surrell

ここにはたくさんの素晴らしい答えがあります - しかし私の問題はもう少し単純なものであることがわかりました。

次のコマンドを実行しようとしました。

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

最初に配列を定義していなかったので、illegal stringでこの$x['name']エラーが発生していました。それで、私は$x[]にものを代入することを試みる前に以下のコード行を入れます:

$x = array();

そしてそれはうまくいった。

10
Brian Powell

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
4
Anirudh Sood

この質問には少し遅れましたが、検索している人のために:私は間違った値(タイプ)で初期化することによってこのエラーを得ました:

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

正しい方法は:

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

私の場合は、mysql_fetch_assocをmysql_fetch_arrayに変更して解きます。それを解決するのに3日かかります:-(そして私のproyectの他のバージョンはfetch assocで動きます。

1
Pichitron

配列をチェックする前に、これを行います。

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

誰かに役立つことを考えれば、シリアル化された配列をシリアル化解除するのを忘れたため、このエラーが発生しました。それは間違いなくあなたのケースに当てはまるかどうか私がチェックするものです。

0
Marc

ただ使う

$memcachedConfig = array();

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


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

これは、$ memcachedConfigを定義しないためです。デフォルトでは、配列ではなく文字列で処理されます。

0
chayankQ

私の場合は、 sql queryを実行する関数を変更したときに解決しました:return json_encode($array)その後:return $array

0
Kleber Caldas

それは私に働きます:

私のテストコード:

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

出力:55

確認してください。ありがとう

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
edo.b hiortee

私は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