Ich bekomme einen seltsamen PHP Fehler, nachdem ich meine PHP-Version auf 5.4.0-3 aktualisiert habe.
Ich habe dieses Array:
Array
(
[Host] => 127.0.0.1
[port] => 11211
)
Wenn ich versuche, so darauf zuzugreifen, bekomme ich seltsame Warnungen
print $memcachedConfig['Host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'Host' in ....
Warning: Illegal string offset 'port' in ...
Ich möchte meine php.ini wirklich nicht bearbeiten und die Fehlerstufe neu einstellen.
Bitte versuchen Sie es auf diese Weise .... Ich habe diesen Code getestet .... Es funktioniert ....
$memcachedConfig = array("Host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['Host']);
Der Fehler Illegal string offset 'whatever' in...
bedeutet im Allgemeinen: Sie versuchen, eine Zeichenfolge als vollständiges Array zu verwenden.
Das ist tatsächlich möglich, da Strings als Arrays von einzelnen Zeichen in PHP behandelt werden können. Sie denken also, dass $ var ein Array mit einem Schlüssel ist, aber es ist nur ein string mit numerischen Standardschlüsseln, beispielsweise:
$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
Sie können dies in Aktion hier sehen: http://ideone.com/fMhmkR
Für diejenigen, die zu dieser Frage kommen und versuchen, die Ungenauigkeit des Fehlers in etwas umzuwandeln, so wie ich es tat.
Sie versuchen, auf ein string
zuzugreifen, als wäre es ein Array mit einem Schlüssel, der ein string
ist. string
wird das nicht verstehen. Im Code sehen wir das Problem:
"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.
Warnung: Ungültiger String-Versatz 'Port' in ...
Was sagt es? Es heißt, wir versuchen, den String 'port'
als Offset für einen String zu verwenden. So was:
$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 ...
Aus irgendeinem Grund haben Sie eine array
erwartet, aber Sie haben eine string
. Nur eine Verwechslung. Vielleicht wurde Ihre Variable geändert, vielleicht war es nie ein array
, es ist wirklich nicht wichtig.
Wenn wir know ein _ array
haben sollten, sollten wir ein paar grundlegende Debugging-Aktionen durchführen, um festzustellen, warum wir kein array
haben. Wenn wir nicht wissen, ob wir array
oder string
haben, werden die Dinge ein bisschen schwieriger.
Was wir can tun, ist alle Arten von Überprüfungen, um sicherzustellen, dass wir keine Hinweise, Warnungen oder Fehler mit Dingen wie is_array
und isset
oder array_key_exists
haben:
$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
}
Es gibt einige Unterschiede zwischen isset
und array_key_exists
. Wenn der Wert von $array['key']
beispielsweise null
ist, gibt isset
false
zurück. array_key_exists
überprüft nur, ob der Schlüssel existiert.
Es gibt viele großartige Antworten - aber ich fand, dass mein Problem ein bisschen einfacher war.
Ich habe versucht, den folgenden Befehl auszuführen:
$x['name'] = $j['name'];
und ich erhielt diesen illegal string
-Fehler bei $x['name']
, da ich das Array nicht zuerst definiert hatte. Also füge ich die folgende Codezeile ein, bevor ich $x[]
Dinge zuweisen wollte:
$x = array();
und es hat funktioniert.
Ab PHP 5.4 müssen wir den gleichen Datentypwert übergeben, den eine Funktion erwartet. Zum Beispiel:
function testimonial($id); // This function expects $id as an integer
Wenn Sie diese Funktion aufrufen, wird ein String-Wert wie folgt angegeben:
$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning
Dies führt zu einer ungültigen Offset-Warnung, da der Datentyp nicht übereinstimmt. Um dies zu lösen, können Sie settype
verwenden:
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Ein wenig zu spät zur Frage, aber für andere, die suchen: Ich habe diesen Fehler erhalten, indem ich mit einem falschen Wert (Typ) initialisierte:
$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset
Der richtige Weg ist:
$varName = array();
$varName["x"] = "test"; // works
In meinem Fall ändere ich mysql_fetch_assoc in mysql_fetch_array und löse. Es dauert 3 Tage, um zu lösen :-( und die anderen Versionen meines Projekts laufen mit fetch assoc.
Bevor Sie das Array überprüfen, müssen Sie Folgendes tun:
if(!is_array($memcachedConfig))
$memcachedConfig = array();
Nur wenn es jedem hilft, erhielt ich diesen Fehler, weil ich vergessen hatte, ein serialisiertes Array zu desialisieren. Das ist definitiv etwas, das ich prüfen würde, wenn es auf Ihren Fall zutrifft.
benutz einfach
$memcachedConfig = array();
vor
print $memcachedConfig['Host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'Host' in ....
Warning: Illegal string offset 'port' in ....
dies liegt daran, dass Sie niemals definieren, was $ memcachedConfig ist. Standardmäßig werden also Zeichenfolgen und keine Arrays behandelt.
In meinem Fall habe ich es gelöst, als ich in der Funktion änderte, dass sql query Nach: return json_encode($array)
Dann: return $array
Es funktioniert für mich:
Testcode von mir:
$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{
$test = $result['c'];
}
print_r($test);
Ausgabe: 55
Überprüfen Sie es Jungs. Vielen Dank
Es ist eine alte, aber falls jemand davon profitieren kann. Sie erhalten diese Fehlermeldung auch, wenn Ihr Array leer ist.
In meinem Fall hatte ich:
$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname'];
was ich geändert habe:
$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';
}
Ich habe dieses Problem mit der trim () - Funktion gelöst. das Problem war mit dem Raum.
lass es uns versuchen
$unit_size = []; //please declare the variable type
$unit_size = exolode("x", $unit_size);
$width = trim ($unit_size[1] );
$height = trim ($unit_size[2] );
Ich hoffe, dies wird dir helfen.