私の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を編集してエラーレベルを再設定したくはありません。
この方法を試してください....私はこのコードをテストしました....それはうまくいきます....
$memcachedConfig = array("Host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['Host']);
エラー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
私がそうであったように、エラーのあいまいさをそれについて何かをすることに変換しようとしているこの質問に来る人々のために。
あなたは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
を持っていないかを決定するためにいくつかの基本的なデバッグをするべきです。 array
とstring
のどちらがあるのかわからない場合、状況は少し複雑になります。
canが行うことは、 is_array
や 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']
の値がnull
の場合、isset
はfalse
を返します。 array_key_exists
はキー 存在 をチェックするだけです。
ここにはたくさんの素晴らしい答えがあります - しかし私の問題はもう少し単純なものであることがわかりました。
次のコマンドを実行しようとしました。
$x['name'] = $j['name'];
最初に配列を定義していなかったので、illegal string
でこの$x['name']
エラーが発生していました。それで、私は$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
この質問には少し遅れましたが、検索している人のために:私は間違った値(タイプ)で初期化することによってこのエラーを得ました:
$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset
正しい方法は:
$varName = array();
$varName["x"] = "test"; // works
私の場合は、mysql_fetch_assocをmysql_fetch_arrayに変更して解きます。それを解決するのに3日かかります:-(そして私のproyectの他のバージョンはfetch assocで動きます。
配列をチェックする前に、これを行います。
if(!is_array($memcachedConfig))
$memcachedConfig = array();
誰かに役立つことを考えれば、シリアル化された配列をシリアル化解除するのを忘れたため、このエラーが発生しました。それは間違いなくあなたのケースに当てはまるかどうか私がチェックするものです。
ただ使う
$memcachedConfig = array();
前
print $memcachedConfig['Host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'Host' in ....
Warning: Illegal string offset 'port' in ....
これは、$ memcachedConfigを定義しないためです。デフォルトでは、配列ではなく文字列で処理されます。
私の場合は、 sql queryを実行する関数を変更したときに解決しました: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
確認してください。ありがとう
それは古いものですが、誰かがこれから利益を得ることができる場合に備えて。配列が空の場合もこのエラーが発生します。
私の場合は、
$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';
}
私はtrim()関数を使ってこの問題を解決しました。問題はスペースにありました。
だから試してみましょう
$unit_size = []; //please declare the variable type
$unit_size = exolode("x", $unit_size);
$width = trim ($unit_size[1] );
$height = trim ($unit_size[2] );
これがお役に立てば幸いです。