Pek çok garip karakterle doldurulmuş bazı php dizi anahtarlarım var.
Buna izin verilir mi? Kullanamayacağım herhangi bir kısıtlama var mı?
Pek çok garip karakterle doldurulmuş bazı php dizi anahtarlarım var.
Buna izin verilir mi? Kullanamayacağım herhangi bir kısıtlama var mı?
Yanıtlar:
Kılavuza göre :
Anahtar, bir tamsayı veya bir dize olabilir. Değer herhangi bir türde olabilir.
Ek olarak aşağıdaki anahtar yayınlar gerçekleşecektir:
- Geçerli tamsayılar içeren dizeler tamsayı türüne dönüştürülecektir. Örneğin, "8" anahtarı aslında 8'in altında saklanacaktır. Öte yandan, "08" geçerli bir ondalık tam sayı olmadığı için dönüştürülmeyecektir.
- Kayan sayılar ayrıca tamsayılara dönüştürülür, bu da kesirli kısmın kesileceği anlamına gelir. Örneğin, 8.7 anahtarı aslında 8'in altında saklanacaktır.
- Bool'lar da tamsayılara çevrilir, yani true anahtarı aslında 1'in altında ve false anahtarı 0'ın altında saklanır.
- Null, boş dizeye dönüştürülecektir, yani null anahtarı aslında "" altında saklanacaktır.
- Diziler ve nesneler anahtar olarak kullanılamaz. Bunu yapmak bir uyarıyla sonuçlanacaktır: Geçersiz ofset türü.
Kılavuz yine :
Bir dize, bir karakterin bir bayt ile aynı olduğu karakter dizisidir. Bu, PHP'nin yalnızca 256 karakterlik bir diziyi desteklediği ve dolayısıyla yerel Unicode desteği sunmadığı anlamına gelir. Dize türünün ayrıntılarına bakın.
Kısacası, herhangi bir dizge bir anahtar olabilir. Ve bir dize herhangi bir ikili veri içerebilir (2 GB'a kadar). Bu nedenle, bir anahtar herhangi bir ikili veri olabilir (çünkü bir dize herhangi bir ikili veri olabilir).
Dizi anahtarlarının bazı rastgele (geçerli) kötüye kullanımı:
$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);
Anahtar bir dize veya tam sayı olmalıdır. Bazı yayınlar var, ancak el kitabının şunları açıklamakta iyi bir iş çıkardığını düşünüyorum:
Anahtar, bir tamsayı veya bir dize olabilir. Değer herhangi bir türde olabilir.
Ek olarak aşağıdaki anahtar yayınlar gerçekleşecektir:
- Geçerli tamsayılar içeren dizeler tamsayı türüne dönüştürülecektir. Örneğin, "8" anahtarı aslında 8'in altında saklanacaktır. Öte yandan, "08" geçerli bir ondalık tam sayı olmadığı için dönüştürülmeyecektir.
- Kayan sayılar ayrıca tamsayılara dönüştürülür, bu da kesirli kısmın kesileceği anlamına gelir. Örneğin, 8.7 anahtarı aslında 8'in altında saklanacaktır.
- Bool'lar da tamsayılara çevrilir, yani true anahtarı aslında 1'in altında ve false anahtarı 0'ın altında saklanır.
- Null, boş dizeye dönüştürülecektir, yani null anahtarı aslında "" altında saklanacaktır.
- Diziler ve nesneler anahtar olarak kullanılamaz. Bunu yapmak bir uyarıyla sonuçlanacaktır: Geçersiz ofset türü.
Yaşadığım bir sorunla ilgili daha fazla bilgi ararken bu cevabı buldum. İçlerinde UTF-8 karakterleri olan dizeler kullanıyordum, bu benim sahip olduğum bir dizinin anahtarı olarak çalışmazdı.
Gibi bir şey
$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str]; // did not work
Benim için (büyük ya da zekice değil) çözüm bunu yapmaktı ..
$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str]; // works!
bin2hex
anahtar olarak kullanmak daha iyidir, çünkü benzersiz olması garanti edilir, farklıdır md5
ve kullanılarak her zaman orijinal haline geri döner hex2bin
. Muhtemelen ondan çok daha hızlı md5
.
PHP dizi anahtarları tamsayılar veya dizeler olabilir. PHP dizeleri bayt dizileridir, yani bayt dizileri. Başka tür dizge yoktur ve PHP başka türlü dizi anahtar dizgilerine herhangi bir özel kısıtlama getirmez. Başka bir deyişle: bir ip olduğu sürece, her şey gider.
Karmaşık anahtarlar "tanımsız dizin" hatasına neden oluyorsa, yalnızca bir "kırpma" sorununuz olabilir.
Çıldırıyordum çünkü karmaşık bir anahtar "tanımlanmamış dizin" hatasını veriyordu ve bunun bir sözdizimi ihlali olduğunu düşündüm. Hataya neden olan dizi anahtarı, bir anahtara dönüştürdüğüm ve yeni bir dizide kullandığım MySQL veritabanı sorgusundaki bir alandan oluşturuldu. Anahtar şuna benziyordu: pl_1DNKoiJKwotCqAycickBVhTy
ve işte kodun nasıl oluşturulduğu.
//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};
//key value found in field of second array
$keyval = $array_two['fieldname'];
//this produced the "undefined index" error
echo $new_array[$keyval];
aslında, $keyval
ve $dbquery['fieldname']
mükemmel bir eşleşme olarak göründüğünde (her ikisini de tarayıcıya yansıtılarak görsel olarak doğrulanır). Gizem, basitçe trim
şu şekilde ikinci ifadede kullanılarak çözüldü : $keyval = trim($array_two['fieldname']);
Bir kez 'kırpıldığında', php artık şikayet etmiyordu.
Bunun bazılarını sinir bozucu anlardan kurtaracağını umuyorum ...
Php dizisinde şu anahtarı kullanamazsınız: 2.3 veya ondalık sayılar
Php sayfasını ANSI "é" olarak kodlayın (Cinéma, Cinà © ma olarak görünmeyecek). Notepad ++ 'da sadece Encode => ANSI dönüştür menüsünü kullanın ve kaydedin
é
mevcut değilse, OP Notepad ++ kullanmazsa ne olur?
$a = (object) ['@km³' => 123]; error_log($a->@km³);