2011-08-10 15 views
5

Anahtarların Dizeler olduğu bir dizi var, ancak bu dizeler bazen yalnızca sayılardır (ör. "123"). Diziye "123" anahtarıyla erişmeye çalışırken, bir Tanımlanmamış Dizin uyarısı alırız. Sadece tam sayı 123 ile erişirken, Tanımlanmamış Ofset bildirimini alırız. Bu bize "123" dizesini kullanarak doğru şekilde dizine eklememizi söylüyor, ancak hala ayarlanmadı.Dize anahtarı x ile erişim dizisi, burada x "123" dir

Bu SO sorusu için bir örnek bulmaya çalışmak, bu zor çünkü PHP, test durumumuzdaki dizi anahtarlarını otomatik olarak tam sayılara dönüştürürken, gerçek dünyadaki uygulamada bu gerçekleşmez (Java kullanımı nedeniyle) Köprü). Şimdi çalışıyoruz testi dizidir:

<?php 
$array = array("123" => array(108, 8)); 
var_dump($array); 
?> 

Bu döndürür: Bizim gerçek dünya eşdeğer iken

array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } } 

, bu dönecekti:

array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } } 

Yani gerçek dünya endeksi aslında bir String'dir:

<?php 
foreach ($array as $key => $value) { 
    if (!isset($array[$key])) { 
     print "What is happening here?"; 
    } 
} 
?> 

verir:

What is happening here? 

Yoshi 'açıklama dayanarak, burada çalışıyor Test kodu:

210 döner

Yani
array(1) { [0]=> string(3) "123" } 

, nihayet soru şu kod çıkışı

<?php 
$array = (array)json_decode('{"123":[108,8]}'); 
foreach ($array as $key => $value) { 
    if (!isset($array[$key])) { 
     print "What is happening here?"; 
    } else { 
     print "Nothing to see here, move along"; 
    } 
} 
?> 
+1

Sorunuza cevap size yardımcı olamaz:

İşte benim çözümdür. Ama eğer '$ array = (array) json_decode ('{" 123 ": [108,8]}') kullanırsanız,' 'Gerçek dünya örneğinizi (123'lü bir dize tuşu olarak) alırsınız. Belki bu başkalarının sorunu yeniden üretmesine yardımcı olabilir. – Yoshi

+0

(başvuru) http: // codepad.org/ewMJyKDU Bunun gerçekten ilginç bir soru olduğunu düşünüyorum. Ve umarım birileri davranışa ışık tutabilir. – Yoshi

cevap

2

Değil çok şık bir çözüm de, aynı zamanda çalışır ve diziyi yeniden gerekmez. Ayrıca, eleman değerine erişebilirsiniz.

$array = (array)json_decode('{"123":100}'); 
$array_keys = array_keys($array); 
$array = (object)$array; 

foreach ($array_keys as $key) 
{ 

    if (!isset($array->$key)) 
    { 
     print "What is happening here?"; 
    } 
    else { 
     print "It's OK val is {$array->$key}"; 
    } 
} 

Not $$array->$key anahtarın önce, bu önemlidir.

+0

Geç kabul için üzgünüz, en sonunda sonunda bunu kontrol etmek için etrafta dolaştım Gerçekten de çok şık değil, ama işe yaramıyor. – drvdijk

1

Şuna bak $ Anahtarın kodu (ve hat $array[(string)$key])

<?php 
$array = array("123" => array(108, 8)); 

foreach ($array as $key => $value) 
{ 
    if (!isset($array[(string)$key])) 
    { 
     print "What is happening here?"; 
    } 
    else print "It's just types"; 
} 

Tip otomatik tamsayı demir atıldı, ve bu tuş dizide bulunamadı neden bu kadar.

bu konuda tüm bilgiler kılavuzda bulabilirsiniz: http://php.net/manual/en/language.types.type-juggling.php

Bu kod olacak iki durumda ile çalışır:

foreach ($array as $key => $value) 
{ 
    if (!array_key_exists($key, $array)) 
    { 
     print "What is happening here?"; 
    } 
    else print "It's just types"; 
} 
+1

'$ array = (array) json_decode ('{" 123 ": [108,8]}');' kullanmayı deneyin. 'Burada neler oluyor?' Yazdıracak. – Yoshi

+0

@Yoshi denediniz mi? "Sadece türleri" çıktılar. Ve json_decode diziyi döndürmek için ikinci argümana sahiptir. –

+0

Denedik. "Neler oluyor?" Diye çıktı. Soruyu, kullandığımız test koduyla güncelledik. – drvdijk

0

Aynı sorunu yaşadım (ancak array_intersect_key ile).

$array = array_combine(array_keys($array), $array)