Unzulässiger String-Offset Warnung PHP


193

Ich erhalte 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, erhalte ich seltsame Warnungen

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


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

Ich möchte wirklich nicht nur meine php.ini bearbeiten und die Fehlerstufe zurücksetzen.


20
Offensichtlich $memcachedConfigist das nicht Array. Showvar_dump($memcachedConfig);
zerkms

1
Dies bedeutet, dass die Schlüssel nicht vorhanden sind. Überprüfen Sie Ihre Variable mit var_export($memcachedConfig)kurz vor dem "Drucken".
Skrol29

9
Was die meisten Leute vermisst haben, ist nicht genau, dass der Index nicht existiert - das erzeugt die Nachricht "undefinierter Index". Dies ist ein anderer Fehler.
Grantwparks

5
stackoverflow.com/a/20271518/2898712 ist hier die richtige Antwort.
Mi

19
Achtung, wer diese Frage sieht: Die richtige Antwort auf diese Frage ist nicht die markierte; richtig ist Kzqai unten
Aaron

Antworten:


37

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']);

1
Fand es. Danke für Ihre Hilfe. var_dump hat geholfen. Ich habe das Array aus einer Konfigurationsdatei geladen, die den Strage-Inhalt wie folgt hatte. Array (2) {["Host"] => String (9) "127.0.0.1" ["Port"] => String (5) "11211"} String (5) "m_prefix" PHP 5.4 jetzt $ xx [' Host '] warf die Warnung korrekt.
Thesonix

Ich hatte den gleichen Fehler nach einem include_once($file);. Das Array wurde korrekt erstellt (die Debug-Informationen zeigen dies), musste jedoch manuell in ein anderes Array kopiert werden, bevor es ohne die PHP-Warnmeldung "Ungültiger Stringoffset" verwendet werden konnte.
Franz Holzinger

$ sStartDate = Datum ("Ymd", strtotime ($ feed ['DTSTART'] ['Wert'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); So beheben Sie den gleichen Fehler hier Warnung: Unzulässiger String-Offset
J. Shabu

302

Der Fehler Illegal string offset 'whatever' in...bedeutet im Allgemeinen: Sie versuchen, eine Zeichenfolge als vollständiges Array zu verwenden.

Dies ist tatsächlich möglich, da Strings in PHP als Arrays einzelner Zeichen behandelt werden können. Sie denken also, $ var ist ein Array mit einem Schlüssel, aber es ist nur eine Zeichenfolge mit numerischen Standardschlüsseln, zum Beispiel:

$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 hier in Aktion sehen: http://ideone.com/fMhmkR

Für diejenigen, die zu dieser Frage kommen und versuchen, die Unbestimmtheit des Fehlers in etwas zu übersetzen, das sie tun können, wie ich es war.


8
Ich wette, es kann gezeigt werden, dass dies der Grund war, warum das ursprüngliche Problem aufgetreten ist. Die meisten Kommentare gehen fälschlicherweise davon aus, dass "undefinierter Index" der Fehler war.
Grantwparks

1
Ist in einer while-Schleife auf dieses Problem gestoßen. Vielen Dank
David Okwii

Manchmal kann dieser Fehler auftreten, wenn versucht wird, den falschen Knoten eines mehrdimensionalen Arrays zu
erfassen

Das ist richtig, ich habe fetchAll(PDO::FETCH_ASSOC)stattdessen verwendet fetch(PDO::FETCH_ASSOC)und perfekt gearbeitet.
MNN

Aus Versehen habe ich dasselbe $variablename = [];zweimal an einem anderen Teil meines Codes verwendet, mit $variablename = "test";dem die Fehlermeldung verursacht wurde.
Kai Noack

77

TL; DR

Sie versuchen, auf stringein Array zuzugreifen, als wäre es ein Array mit einem Schlüssel, der a ist string. stringwerde das nicht verstehen. Im Code können wir das Problem sehen:

"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.

In der Tiefe

Lassen Sie uns diesen Fehler sehen:

Warnung: Unzulässiger String-Offset 'Port' in ...

Was sagt es? Es heißt, wir versuchen, die Zeichenfolge 'port'als Offset für eine Zeichenfolge 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 ...

Was verursacht das?

Aus irgendeinem Grund haben Sie eine erwartet array , aber Sie haben eine string. Nur eine Verwechslung. Vielleicht wurde Ihre Variable geändert, vielleicht war es nie eine array, es ist wirklich nicht wichtig.

Was kann getan werden?

Wenn wir wissen, dass wir eine haben sollten array, sollten wir einige grundlegende Fehlerbehebungen durchführen, um festzustellen, warum wir keine haben array. Wenn wir nicht wissen, ob wir ein arrayoder haben werdenstring , werden die Dinge etwas schwieriger.

Was wir tun können , sind alle Arten von Überprüfungen, um sicherzustellen, dass wir keine Hinweise, Warnungen oder Fehler mit Dingen wie is_arrayund issetoder haben 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
}

Es gibt einige subtile Unterschiede zwischen issetund array_key_exists. Wenn beispielsweise der Wert von $array['key']ist null, wird issetzurückgegeben false. array_key_existsIch werde nur überprüfen, ob der Schlüssel existiert .


13

Hier gibt es viele gute Antworten - aber ich fand mein Problem viel einfacher.

Ich habe versucht, den folgenden Befehl auszuführen:

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

und ich bekam diesen illegal stringFehler, $x['name']weil ich das Array nicht zuerst definiert hatte. Also habe ich die folgende Codezeile eingefügt, bevor ich versuche, Dinge zuzuweisen $x[]:

$x = array();

und es hat funktioniert.


1
Ich denke, das sollte die Antwort sein. Dies muss der Unterschied zwischen 5.4 (und dem vor 7) und 7.
sonnb

7

Ein bisschen spät zur Frage, aber für andere, die suchen: Ich habe diesen Fehler durch Initialisieren mit einem falschen Wert (Typ) erhalten:

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

Der richtige Weg ist:

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

Wenn $ varName aus einem Wert initialisiert wird, der ein Array sein sollte, aber möglicherweise eine leere Zeichenfolge ist, kann dies durch Erzwingen des Werts vermieden werden, z. B.: $ VarName = (Array) $ shouldBeArray
markdwhite

4

Ab PHP 5.4 müssen wir denselben Datentypwert übergeben, den eine Funktion erwartet. Beispielsweise:

function testimonial($id); // This function expects $id as an integer

Wenn beim Aufrufen dieser Funktion ein Zeichenfolgenwert wie folgt angegeben wird:

$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning

Dies generiert eine unzulässige Offset-Warnung aufgrund einer Nichtübereinstimmung des Datentyps. Um dies zu lösen, können Sie Folgendes verwenden settype:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly

Wie hat das mit Arrays zu tun ...?
einige-nicht-beschreibende-Benutzer

2

Gehen Sie folgendermaßen vor, um das Array zu überprüfen:

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

1

In meinem Fall ändere ich mysql_fetch_assoc in mysql_fetch_array und löse. Die Lösung dauert 3 Tage :-( und die anderen Versionen meines Proyect laufen mit fetch assoc.


1

In meinem Fall habe ich es gelöst, als ich die Funktion geändert habe, die SQL- Abfragen nach folgender return json_encode($array) Zeit ausführt : dann:return $array


1

Es funktioniert bei mir:

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


1

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. Daher werden standardmäßig Zeichenfolgen und keine Arrays behandelt.


1

Ich habe dieses Problem mit der Funktion trim () gelöst. Das Problem war mit dem Platz.

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.


0

Nur für den Fall, dass es jemandem hilft, habe ich diesen Fehler erhalten, weil ich vergessen habe, ein serialisiertes Array zu unserialisieren. Das ist definitiv etwas, das ich prüfen würde, wenn es auf Ihren Fall zutrifft.


0

Es ist alt, aber falls jemand davon profitieren kann. Sie erhalten diesen Fehler 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 zu:

$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

Ich denke, der einzige Grund für diese Nachricht ist, dass das Ziel-Array tatsächlich ein Array wie ein String usw. (JSON -> {"host": "127.0.0.1"}) ist


0

Für 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']);

}

Stellen Sie einfach sicher, dass der zurückgegebene Wert nicht leer ist. Dieses Beispiel war für PHP gedacht. Finden Sie heraus, wie Sie überprüfen können, ob ein Array in anderen Sprachen leer ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.