Diziler nesneyi dönüştürme PHP hata

3 Cevap php

Ben daha önce bu soru vardı ve o 5.2.5 bir hata oldu varıldı. Peki, hala en azından benim için, 5.2.6 kırık var:

Kırık veya sizin için çalışır, lütfen bana bildirin:

$obj = new stdClass();
$obj->{"foo"} = "bar";
$obj->{"0"} = "zero";
$arr = (array)$obj;

//foo -- bar
//0 --    {error: undefined index}
foreach ($arr as $key=>$value){
    echo "$key -- " . $arr[$key] . "\n";
}

Ondan sonra dizi "düzeltmek" için herhangi bir yolu bir stdClass gelen döküm olmuştur?

3 Cevap

Kesinlikle benim için bir hata (PHP 5.2.6) gibi görünüyor.

Böyle dizi düzeltebilirsiniz:

$arr = array_combine(array_keys($arr), array_values($arr));

Bu this bug report bildirilmiştir, ancak sahte olarak işaretlenmiş oluyor ... the documentation diyor ki:

The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible;

Deney biraz kendi fonksiyonları bu fubarity yok kalıcı Phps gösterir.

function noopa( $a ){ return $a; }
$arr = array_map('noopa', $arr ); 
$arr[0]; # no error!

Bu etki, sadece dizinin bir kopyasını oluşturur ve düzeltme kopya sırasında oluşur.

Sonuçta, yönüyle onun bir tasarım hatası, bunu karma sayısal ve dize anahtarları ile bir dizi üzerinde çalıştığını düşünüyorum şekilde array_merge kullanmayı deneyin?

Tüm numaralı elemanlar kopyalanan ve bazı bazı, sadece dize-kapsüllü-sayılar olsalar bile, yeniden sayılı olsun, ve sonuç olarak, sadece bu sorunu çözmek için array_merge homebrew uygulamaları düzinelerce vardır.

Php perl bir klon yapmaya çalıştı ve başarısız oldu, onlar dizilerin kavramını kavramak vermedi ve ayrı kavramlar olmaktan sağlamalarının zaman geri, bir yerine, tek bir evrensel çatı bunları bir araya globbed. İyi gidiyor!.

Sonraki numara için, onlar çünkü başka hiçbir dil nedense karşılaştı bazı teknik sorunun ad ayraçları kırmak için yönetmek.

Teşekkürler RoBorg .. ben sadece :) o da keşfetti

Burada başka bir çözüm değil, daha hızlı ya da değil emin eğer bulunuyor:

unserialize(serialize($arr));