Php dizi anahtarlarında karakterlere izin verilir mi?


86

Pek çok garip karakterle doldurulmuş bazı php dizi anahtarlarım var.

Buna izin verilir mi? Kullanamayacağım herhangi bir kısıtlama var mı?


Kısıtlamalar:$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

Yanıtlar:


90

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);

1
Açıklığa kavuşturmak gerekirse, bu Unicode dizelerini dizi anahtarları olarak kullanamayacağınız anlamına gelmez. Aslında, herhangi bir ikili dizge gayet iyi çalışır. PHP'nin kendi tanımladığı Unicode desteği eksikliğini can sıkıcı buluyorum, çünkü bu gerçekten doğru değil. :)
deceze

1
@deceze Unicode "herhangi bir ikili veri" kategorisine giriyor :) (kılavuzun ifadeleriyle sanırım açıklamanın gerekli olduğunu düşünüyorum). Ve "yerel Unicode desteği sunmuyor" demek yeterince doğrudur. PHP çekirdeği strlen, substr, vb. Unicode sürümlerini içermez. "Unicode dizelerinin yerel olarak işlenmesini sunmasa da" daha uygun olabilir.
Corbin

3
Elbette, çekirdek Unicode dizelerini işlemek için herhangi bir özellik içermiyor . Ancak dizeleri değiştirmek istemediğiniz sürece, PHP onları gayet iyi destekler. Ve gerçekçi bir şekilde konuşursak, MB uzantısı hemen hemen her PHP kurulumunda varsayılan olarak mevcuttur, bu nedenle "çekirdek desteği" ile değil arasındaki ayrım çoğunlukla akademiktir. :)
deceze

1
@deceze belki notlarında "yerel olarak değil (mb uzantısına bakın)" veya başka bir şey olmalıdır. Yine de haklısın. 2005'ten beri herhangi bir PHP kurulumu, esasen Unicode'u destekler, ancak PHP'de (uzantılarla) Unicode desteğinin hala biraz tatsız olduğunu iddia ediyorum.
Corbin

@Corbin, neden böyle diyorsunuz istismarı yerine kullanılması ?
Pacerier

12

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

Kaynak türleri artık tamsayıya dönüştürülebilir (bunun yeni bir özellik olup olmadığından emin değiliz), böylece dolaylı olarak tam sayıya çevirerek ve bunu anahtar olarak kullanarak bir dosya tutamacını veya kıvrılma tutamacını anahtar olarak kullanabilirsiniz.
thomasrutter

10

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!

2
Dizi anahtarları oluşturmak için md5 () 'i seviyorum. Bu noktada tamamen gerekli olmasa bile, yine de daha güvenli hissediyor.
billynoah

2
PHP'nin daha eski bir sürümünü mü kullanıyordunuz? İlk örneğiniz PHP 7.1'de iyi çalışıyor.
Elliot B.

bin2hexanahtar olarak kullanmak daha iyidir, çünkü benzersiz olması garanti edilir, farklıdır md5ve kullanılarak her zaman orijinal haline geri döner hex2bin. Muhtemelen ondan çok daha hızlı md5.
Patanjali

6

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.


Bir dizeden tamsayı anahtarına örtük atamanın yapılması gereken önemli bir ayrım olduğunu düşünüyorum, çünkü anahtar bir tamsayı olsa da olmasa da belirli işlevler farklı şekilde çalışır. Örneğin, rastgele dize sayılarını yalnızca bir dizi işlevinin daha sonra 0..n-1'den yeniden dizin oluşturduğunu bulmak için kullanabilirsiniz.
Matthew

1
Kabul edildi, ancak bunun bu sorunun kapsamının sınırında olduğunu düşünüyorum. :)
deceze

5

Bir PHP dizgisine doldurabileceğiniz her şey bir dizi anahtarı olarak kullanılabilir. İzin verilen karakterlerde bir sınır yoktur.

$a = array();

$x = 'long string of random garage';
echo $a[$x]; // this is ok

$x = array();
echo $a[$x]; // not ok

1

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_1DNKoiJKwotCqAycickBVhTyve 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, $keyvalve $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 ...


0

Şahsen, dizi tuşlarındaki alışılmadık karakterlerle herhangi bir sorun yaşamadım. Anahtarın skaler olması gerektiğini söylemekten başka, yasal olan ve olmayan şey iyi belgelenmemiştir. En iyi bahsiniz sadece denemek ve görmek.


Evet, biraz tutarsız, ama iyi belgelenmiştir.
Corbin

0

Doğru oldukları gibi tüm yanıtlara ek olarak: İyi ve standart bir kodlama stiline sahip olmak için en iyi programcılar arasında bir tür kural olduklarını belirten PSR'leri kullanabilirsiniz .


0

Php dizisinde şu anahtarı kullanamazsınız: 2.3 veya ondalık sayılar


-1

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


2
(Bu gönderi soruya kaliteli bir yanıt sağlamıyor gibi görünüyor . Lütfen cevabınızı düzenleyin veya soruya yorum olarak gönderin).
sɐunıɔ ןɐ qɐp

Bunu biraz daha açıklayabilir misin? Ya émevcut değilse, OP Notepad ++ kullanmazsa ne olur?
Nico Haase
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.