Geçersiz dize uzaklığı Uyarı PHP


193

Php sürüm 5.4.0-3 güncelledikten sonra garip bir PHP hatası alıyorum.

Bu dizi var:

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

Bu şekilde erişmeye çalıştığımda garip uyarılar alıyorum

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


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

Gerçekten sadece benim php.ini düzenlemek ve hata seviyesini yeniden ayarlamak istemiyorum.


20
Açıkçası $memcachedConfigbu dizi değil. Göstervar_dump($memcachedConfig);
zerkms

1
Anahtarların olmadığı anlamına gelir. Değişkeninizi var_export($memcachedConfig)"yazdır" dan hemen önce kontrol edin .
Skrol29

9
Çoğu insanın kaçırdığı şey, bu tam olarak dizinin mevcut olmadığı anlamına gelmez - "tanımsız dizin" mesajı üretir. Bu farklı bir hatadır.
grantwparks

5
stackoverflow.com/a/20271518/2898712 burada doğru cevaptır.
wedi

19
Bu soruyu görüntüleyen herkesin dikkatine: Bu soruya doğru cevap işaretli değildir ; doğru Kzqai aşağıda
Aaron

Yanıtlar:


37

Lütfen bu şekilde deneyin .... Bu kodu test ettik .... Çalışıyor ....

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

1
Buldum. Yardımınız için teşekkürler. var_dump yardımcı oldu. Diziyi böyle strage içeriğine sahip bir yapılandırma dosyasından yükledim. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 şimdi $ xx [' host '] uyarısını doğru şekilde attı.
thesonix

Bir hatadan sonra aynı hatayla karşılaştım include_once($file);. Dizi doğru bir şekilde oluşturulmuştur (hata ayıklama bilgisi bunu gösterir), ancak PHP yasadışı stringoffset uyarı mesajı olmadan kullanılabilir olmadan önce başka bir diziye manuel olarak kopyalanması gerekiyordu.
Franz Holzinger

$ sStartDate = tarih ("Ymd", strtotime ($ feed ['DTSTART'] ['değer'])); $ sEndDate = tarih ("Ymd", strtotime ($ feed ['DTEND'] ['değer'])); Aynı hatayı burada nasıl düzeltebilirim Uyarı: Yasadışı dize ofseti
J. Shabu

303

Hata Illegal string offset 'whatever' in...genellikle şu anlama gelir: Bir dizeyi tam dizi olarak kullanmaya çalışıyorsunuz.

Bu aslında dizeleri php tek karakter dizileri olarak tedavi edilebildiği için mümkündür. Yani $ var'ın anahtarlı bir dizi olduğunu düşünüyorsunuz, ancak sadece standart sayısal tuşlara sahip bir dize , örneğin:

$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

Bunu burada çalışırken görebilirsiniz: http://ideone.com/fMhmkR

Bu soruya gelenler, hatanın belirsizliğini benim yaptığım gibi bir şey haline getirmeye çalışıyorlar.


8
Eminim orijinal sorunun ortaya çıkmasının nedeni bu olabilir. Çoğu yorum yanlış "tanımsız dizin" hata olduğunu varsayar.
grantwparks

1
Bir süre döngüde bu sorunla karşılaştı. Teşekkürler
David Okwii

Bazen bu hata, çok boyutlu bir dizinin yanlış düğümünü yakalamaya çalışırken ortaya çıkabilir, yani "çok derin" in yerine, seçimin üst
öğesine

Bu doğru, fetchAll(PDO::FETCH_ASSOC)onun yerine kullandım fetch(PDO::FETCH_ASSOC)ve mükemmel çalıştım.
MNN

Yanlışlıkla $variablename = [];kodumu $variablename = "test";hata mesajına neden olan başka bir kısmında iki kez kullanıyorum .
Kai Noack

77

TL; DR

stringA'ya, bir anahtarmış gibi bir dizi gibi erişmeye çalışıyorsunuz string. stringbunu anlamayacak. Kodda sorunu görebiliriz:

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

Derinlemesine

Şu hatayı görelim:

Uyarı: Geçersiz dize uzaklığı 'bağlantı noktası' ...

Ne diyor? 'port'Dizeyi, bir dizenin uzaklığı olarak kullanmaya çalıştığımızı söylüyor . Bunun gibi:

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

Buna ne sebep olur?

Bir nedenden dolayı beklediğiniz bir array, ama bir string. Sadece bir karma. Belki de değişkeniniz değiştirildi, belki de hiç olmadı, arraygerçekten önemli değil.

Ne yapılabilir?

Biz ise biliyoruz biz olması gereken array, biz bir yok nedenini belirlemek için bazı temel hata ayıklama yapmalıdır array. Bir arrayya da daha fazla olup olmadığımızı bilmiyorsak string, işler biraz daha hileli hale gelir.

Ne yapabilirsiniz yaparsak gibi şeyler bildirimler, uyarı ve hataları yok sağlamak için kontrol her türlü olduğunu is_arrayve issetya 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
}

issetVe arasında bazı ince farklar vardır array_key_exists. Örneğin, değeri ise $array['key']olan null, issetdöner false. array_key_existssadece anahtarın var olduğunu kontrol edecek .


13

Burada çok sayıda harika cevap var - ama sorunumun biraz daha basit olduğunu gördüm.

Aşağıdaki komutu çalıştırmaya çalışıyordum:

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

ve ben önce dizi tanımlamamıştı çünkü ben bu illegal stringhatayı alıyordu $x['name']. Bu yüzden bir şeyler atamaya çalışmadan önce aşağıdaki kod satırını koydum $x[]:

$x = array();

ve işe yaradı.


1
Bence bu cevap olmalı. Bu 5,4 (ve 7 öncesi) ile 7 arasında farklı olmalıdır.
sonnb

7

Sorunun biraz geç, ama arayan diğerleri için: Yanlış bir değer (tür) ile başlatarak bu hatayı aldım:

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

Doğru yol:

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

$ VarName bir dizi olması gereken ancak boş bir dize olabilen bir değerden başlatılırsa, değeri zorlamak bunu önleyebilir, örneğin: $ varName = (dizi) $ shouldBeArray
markdwhite 25:19

4

PHP 5.4'ten itibaren, bir işlevin beklediği aynı veri türü değerini geçirmemiz gerekir. Örneğin:

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

Bu işlevi çağırırken, şöyle bir dize değeri sağlanırsa:

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

Bu, veri türü uyumsuzluğu nedeniyle geçersiz bir ofset uyarısı oluşturur. Bunu çözmek için şunları kullanabilirsiniz settype:

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

Bunun dizilerle nasıl bir ilgisi var?
bazı-descriptsiz kullanıcı

2

Diziyi kontrol etmeden önce şunu yapın:

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

1

Benim durumumda mysql_fetch_assoc mysql_fetch_array değiştirmek ve çözmek. Çözülmesi 3 gün sürer :-( ve benim proyect'imin diğer sürümleri assoc assoc ile çalışır.


1

Benim durumumda, sonra sql sorgusu yapar işlevinde değiştiğinde çözdüm : return json_encode($array) sonra:return $array


1

Benim için çalışıyor:

Test Kodum:

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

Çıktı: 55

Kontrol edin beyler. Teşekkürler


1

sadece kullan

$memcachedConfig = array();

önce

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


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

Bunun nedeni, $ memcachedConfig öğesinin ne olduğunu asla tanımlamamanızdır, bu nedenle varsayılan olarak diziler değil dizeyle işlenir.


1

Bu sorunu trim () işlevini kullanarak çözdüm. konu boşluktu.

Hadi deneyelim

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

Umarım bu sana yardımcı olmuştur.


0

Sadece herkes yardımcı olur, serileştirilmiş bir dizi serileştirmeyi unuttum çünkü bu hatayı alıyorum. Bu kesinlikle sizin davanız için geçerli olup olmadığını kontrol etmem gereken bir şey.


0

Bu eskisi ama birinin bundan faydalanması durumunda. Diziniz boşsa da bu hatayı alırsınız.

Benim durumumda:

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

hangi ben değişti:

$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

Bence bu mesajın tek nedeni, hedef dizi aslında dize vb. gibi bir dizi olmasıdır (JSON -> {"host": "127.0.0.1"}) değişken


0

PHP için

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

}

Geri dönen değerin boş olmadığından emin olun. Yani bu örnek PHP içindi, bu yüzden bir dizinin diğer dillerde boş olup olmadığını nasıl kontrol edeceğinizi öğrenin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.