2015-01-07 10 views
7

ile bir dizi olarak erişilen bir dize değişkeni gelen true döndürür Temelde her ikiisset() Böyle bir sorunla karşı karşıya herhangi bir tuşa

$area['division'] = "Dhaka"; 
isset($area); // returns true which is OK 
isset($area['division']); // returns true it's also OK 
isset($area['ANY_KEY']); // returns false. I also expect this 

isset($area['division']['ANY_KEY']); // returns true why? question #2 

benim sorular aynı.

Bunu açıklayan var mı?

+0

olduğunu. Anlamaya 30 dakika sürdü. Ne acı. –

cevap

9

Varolan her programlama dilinde olduğu gibi, bir dize bir dizi karakter olarak saklanır. Cikarirsam

:

$area = "Dhaka"; 
echo $area[0]; 

O D dönecekti.

Ben de yaparak tüm dizeyi yankı olabilir:

echo $area[0].$area[1].$area[2].$area[3].$area[4]; 

PHP will also type juggle a string into 0 yalnızca tamsayılar kabul eden bir tarzda geçtiğinde. yaparak

Yani:

echo $area['division']; 

Sen esasen yapıyor olurdu:

echo $area[0]; 

ve yine D alma.

Bu yüzden isset($area['division']), true değerini döndürür.

Neden $area['foo']['bar'] (aka $area[0][0]) çalışmıyor? $area, yalnızca tek boyutlu bir dizidir.

is_array($area) && isset($area['division']) 
+0

olsa bile en azından PHP 5.5.25'te sabitlendiğini biliyoruz. – xendi

-1

:

Bir dize veya bir dizi olabilir ya bir değişkenle çalışıyoruz bu sorunu ele almak en iyi yaklaşım bir dizi olarak Değişkeninizi tedavi denemeden önce is_array() ile test etmektir Beklenen davranış.

PHP Documentation covers this

Sen() yerine boş deneyebilirsiniz.

+2

'! Boş ($ alan ['division']) dizisi olduğunu biliyoruz." $ Area ['division'] === 'D ' – sjagr

9

PHP bir dizi olarak bir dize tedavi sağlar:

$foo = 'bar'; 
echo $foo[1]; // outputs 'a' 

Yani

$area['division'] 

beri tuşları dizeleri olamaz (

$area[0]; 

olarak idam/ayrıştırılır GERÇEKTEN bir dizi değil, bu yüzden PHP, division dizginizi dönüştürülme kurallarına dönüştürür ve 0) ve açık olarak ayarlanmış olan Dhaka'daki D mektubunu değerlendiriniz.

+0

'dizi anahtarları dizeleri olamaz ??? Bu senaryoda dizeleri kabul etmeyecektir, ancak dizi anahtarları PHP'de dizge olarak bildirilebilir. – sjagr

+0

Bu yüzden size yaptığım çözümü verdim. Çünkü PHP'nin bir anahtar olarak kabul ettiği önemli değildir. Bildiğimiz halde dizeleri dizge elemanlarına referans olarak kullanabiliriz. Bu yüzden çözümüm iyi bir çözüm. – xendi

+1

üzgünüm. Kötü ifadeler. Bir dizeyle uğraşıyorsanız, dizi gösterim erişimi, anahtarlar için dizeleri kullanamaz. Cevabı biraz çözdüm. –

-1

Var olmayan anahtarlar için doğru dönüyorsa yapabileceğiniz hiçbir şey yoktur; Ancak, kodunuzda olumsuz bir etkisi olmadığından emin olabilirsiniz. Sadece array_key_exists() öğesini kullanın ve ardından dizi elemanında isset() öğesini kullanın.

Düzenleme: Aslında, array_key_exists() işlevini kullanmanız hata yapmıyorsa strlen() gibi bir şey kullanmanız veya array_key_exists true değerini döndürürse değer türünü kontrol etmeniz gerekmiyor.

nokta yerine sadece isset söyleyerek daha vardır ($ Ar [ 'şey']) yapın:

if(array_key_exists('something',$Ar)) 

ve gerekirse değer uzunluğunu veya türünü kontrol edin. Eğer dizinin mevcut olduğunu kontrol etmeniz gerekiyorsa, elbette sadece dizinin kendisinde isset() veya is_array() kullanılır.

+0

Diğer kişinin cevabında, bu davranışın beklendiği açıklandı. Bunu düşündüğünüzde (ya da değil), bu çözümü kullanmak istediğiniz gibi görünüyor. – xendi

+2

'array_key_exists', bir dizeyi ikinci argüman olarak ilettiğinizde bir uyarı atar, dolayısıyla hayır, uyarıları size gönderen bir şey kullanmak istemezsiniz. – sjagr

+0

El kitabındaki örnekte şunları göreceksiniz: array_key_exists ('first', $ search_array). Neden bir ipi ikinci argüman olarak iletirsiniz? – xendi

0

Tamam, işte bu yüzden, isset neden düzgün çalışmaz diye açıklamak yerine bir çözüm.

Bir dizi öğesinin dizin dizesine göre ayarlanıp ayarlanmadığını kontrol etmek istersiniz. İşte bunu yapabilir nasıl:

function isset_by_strkey($KeyStr,$Ar) 
{ 
    if(array_key_exists($KeyStr,$Ar)) 
    { 
     if(strlen($Ar[$KeyStr]) > 0 || is_numeric($Ar[$KeyStr] !== FALSE) 
     { 
      return TRUE; 
     } 
     return FALSE; 
    } 
} 

isset_by_strkey('ANY_KEY',$area); // will return false if ANY_KEY is not set in $area array and true if it is. 
+0

Bu, sorunu giderir ve örneğinizdeki gibi çok boyutlu diziler için kolayca uyarlanabilir. – xendi

+0

Bunu yapmak için, işleve başka bir dize parametresi ekleyin ve daha sonra bir anahtar olarak ek dizeyi kullanarak ek boyutu kontrol eden 2 parametreyi kontrol etmek için bir koşullu deyim ekleyin. – xendi

0

php doğrusal dizisine erişmek için en iyi yolu sadece bu böcek vardı

// string treated as an linear array 
$string= "roni" ; 
echo $string{0} . $string{1} . $string{2} . $string{3}; 

// output = roni 
İlgili konular