String ilegal mengimbangi Peringatan PHP

194

Saya mendapatkan kesalahan PHP yang aneh setelah memperbarui versi php saya ke 5.4.0-3.

Saya punya array ini:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

Ketika saya mencoba mengaksesnya seperti ini saya mendapat peringatan aneh

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


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

Saya benar-benar tidak ingin hanya mengedit php.ini saya dan mengatur ulang tingkat kesalahan.

campuran itu
sumber
20
Jelas $memcachedConfigbukan array itu. Showvar_dump($memcachedConfig);
zerkms
1
Itu berarti kunci tidak ada. Periksa variabel Anda dengan var_export($memcachedConfig)tepat sebelum "cetak".
Skrol29
9
Apa yang kebanyakan orang lewatkan adalah ini tidak berarti indeks tidak ada - yang menghasilkan pesan "indeks tidak terdefinisi". Ini adalah kesalahan yang berbeda.
Grantwparks
5
stackoverflow.com/a/20271518/2898712 adalah jawaban yang benar di sini.
wedi
19
Perhatian siapa pun yang melihat pertanyaan ini: Jawaban yang benar untuk pertanyaan ini bukan yang ditandai; benar adalah Kzqai di bawah ini
Aaron

Jawaban:

37

Silakan coba dengan cara ini .... Saya telah menguji kode ini .... Berhasil ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
mari kita memelihara
sumber
1
Menemukannya. Terima kasih atas bantuan Anda. var_dump membantu. Saya memuat array dari file konfigurasi, yang memiliki konten strage seperti ini. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 sekarang $ xx [' host '] melemparkan peringatan dengan benar.
thesonix
Saya memiliki kesalahan yang sama setelah include_once($file);. Array telah dibangun dengan benar (info debug menunjukkan ini), namun harus disalin secara manual ke array lain sebelum dapat digunakan tanpa pesan peringatan stringoffset ilegal PHP.
Franz Holzinger
$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Cara memperbaiki kesalahan yang sama di sini Peringatan: Offset string ilegal
J. Shabu
303

Kesalahan Illegal string offset 'whatever' in...umumnya berarti: Anda mencoba menggunakan string sebagai array penuh.

Itu sebenarnya mungkin karena string dapat diperlakukan sebagai array karakter tunggal di php. Jadi Anda berpikir $ var adalah array dengan kunci, tetapi itu hanya string dengan kunci numerik standar, misalnya:

$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

Anda dapat melihat ini dalam aksi di sini: http://ideone.com/fMhmkR

Bagi mereka yang datang ke pertanyaan ini mencoba menerjemahkan ketidakjelasan kesalahan menjadi sesuatu yang harus dilakukan tentang itu, seperti saya.

Kzqai
sumber
8
Saya yakin dapat ditunjukkan ini adalah alasan masalah aslinya terjadi. Sebagian besar komentar salah menganggap "indeks tidak terdefinisi" adalah kesalahan.
Grantwparks
1
Mengalami masalah ini dalam loop sementara. Terima kasih
David Okwii
Kadang-kadang kesalahan ini dapat terjadi ketika mencoba untuk mengambil simpul yang salah dari array multidimensi, yaitu pergi "terlalu dalam", Anda membutuhkan orang tua pilihan
zoltar
Ini benar, saya menggunakan fetchAll(PDO::FETCH_ASSOC)sebagai gantinya fetch(PDO::FETCH_ASSOC)dan bekerja dengan sempurna.
MNN
Secara tidak sengaja saya telah menggunakan yang sama $variablename = [];dua kali, di bagian lain dari kode saya $variablename = "test";yang menyebabkan pesan kesalahan.
Kai Noack
77

TL; DR

Anda mencoba mengakses stringseolah-olah array, dengan kunci yang a string. stringtidak akan mengerti itu. Dalam kode kita dapat melihat masalahnya:

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

Secara mendalam

Mari kita lihat kesalahan itu:

Peringatan: String ilegal mengimbangi 'port' di ...

Apa yang dikatakan? Dikatakan kami mencoba menggunakan string 'port'sebagai offset untuk string. Seperti ini:

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

Apa yang menyebabkan ini?

Untuk beberapa alasan Anda mengharapkan array, tetapi Anda memiliki string. Hanya campuran. Mungkin variabel Anda diubah, mungkin tidak pernah menjadi array, itu benar-benar tidak penting.

Apa yang bisa dilakukan?

Jika kita tahu kita harus memiliki array, kita harus melakukan beberapa debugging dasar untuk menentukan mengapa kita tidak memiliki array. Jika kita tidak tahu apakah kita akan memiliki arrayatau string, segalanya menjadi sedikit lebih rumit.

Apa yang bisa kita lakukan adalah segala macam pemeriksaan untuk memastikan kita tidak memiliki pemberitahuan, peringatan atau kesalahan dengan hal-hal seperti is_arraydan issetatau 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
}

Ada beberapa perbedaan halus antara issetdan array_key_exists. Misalnya, jika nilai $array['key']is null, issetreturn false. array_key_existshanya akan memeriksa itu, yah, kuncinya ada .

Jon Surrell
sumber
13

Ada banyak jawaban bagus di sini - tapi saya menemukan masalah saya agak lebih sederhana.

Saya mencoba menjalankan perintah berikut:

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

dan saya mendapatkan illegal stringkesalahan ini $x['name']karena saya belum mendefinisikan array terlebih dahulu. Jadi saya memasukkan baris kode berikut sebelum mencoba untuk menetapkan hal-hal ke $x[]:

$x = array();

dan itu berhasil.

Brian Powell
sumber
1
Saya pikir ini harus menjadi jawabannya. Ini harus berbeda antara 5,4 (dan sebelum 7) dan 7.
sonnb
7

Agak terlambat untuk pertanyaan, tetapi untuk orang lain yang mencari: Saya mendapatkan kesalahan ini dengan menginisialisasi dengan nilai (tipe) yang salah:

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

Cara yang benar adalah:

 $varName = array();
 $varName["x"] = "test"; // works
Marco
sumber
Di mana $ varName diinisialisasi dari nilai yang seharusnya berupa array tetapi mungkin berupa string kosong, memaksa nilai dapat menghindari ini, misalnya: $ varName = (array) $ shouldBeArray
markdwhite
4

Mulai dari PHP 5.4 kita perlu memberikan nilai tipe data yang sama dengan yang diharapkan oleh suatu fungsi. Sebagai contoh:

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

Saat menjalankan fungsi ini, jika nilai string diberikan seperti ini:

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

Ini akan menghasilkan peringatan offset ilegal karena ketidakcocokan datatype. Untuk mengatasi ini, Anda dapat menggunakan settype:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Anirudh Sood
sumber
Bagaimana hubungannya dengan array ...?
some-non-descript-user
2

Sebelum memeriksa array, lakukan ini:

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

Dalam kasus saya, saya mengubah mysql_fetch_assoc ke mysql_fetch_array dan menyelesaikannya. Butuh 3 hari untuk menyelesaikan :-( dan versi lain dari proyect saya berjalan dengan mengambil assoc.

Pichitron
sumber
1

Dalam kasus saya, saya menyelesaikannya ketika saya mengubah fungsi yang melakukan kueri sql setelah: return json_encode($array) lalu:return $array

Kleber Caldas
sumber
1

Ini bekerja untuk saya:

Kode Pengujian milik saya:

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

Keluaran: 55

Periksa teman-teman. Terima kasih

Y. Joy Ch. Singha
sumber
1

gunakan saja

$memcachedConfig = array();

sebelum

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


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

ini karena Anda tidak pernah mendefinisikan apa yang $ memcachedConfig, jadi secara default diperlakukan oleh string bukan array ..

chayankQ
sumber
1

Saya memecahkan masalah ini dengan menggunakan fungsi trim (). masalahnya adalah ruang.

jadi mari kita coba

$unit_size = []; //please declare the variable type 
$unit_size = exolode("x", $unit_size);
$width  = trim ($unit_size[1] );
$height = trim ($unit_size[2] );

Saya harap ini akan membantu Anda.

Jailendra Rajawat
sumber
0

Hanya memetikannya itu membantu siapa pun, saya mendapatkan kesalahan ini karena saya lupa untuk membatalkan serial array. Itu pasti sesuatu yang akan saya periksa jika itu berlaku untuk kasus Anda.

Marc
sumber
0

Itu sudah tua tapi siapa tahu bisa mendapat manfaat dari ini. Anda juga akan mendapatkan kesalahan ini jika array Anda kosong.

Dalam kasus saya, saya memiliki:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 

yang saya ubah menjadi:

$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';
}
edo.b hiortee
sumber
0

saya pikir satu-satunya alasan untuk pesan ini adalah karena target Array sebenarnya adalah array seperti string dll (JSON -> {"host": "127.0.0.1"}) variabel

adnan ahmady
sumber
0

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

}

Pastikan untuk memeriksa bahwa nilai yang dikembalikan tidak kosong. Jadi contoh ini untuk PHP, jadi cari tahu cara memeriksa apakah array kosong dalam bahasa lain.

Delorme Grant
sumber