อนุญาตให้ใช้อักขระในคีย์อาร์เรย์ php?


86

ฉันมีคีย์อาร์เรย์ php ที่มีอักขระแปลก ๆ มากมาย

อนุญาตหรือไม่ มีข้อ จำกัด ในสิ่งที่ฉันใช้ไม่ได้หรือไม่?


ข้อ จำกัด :$a = (object) ['@km³' => 123]; error_log($a->@km³);
Bitterblue

คำตอบ:


90

ตามคู่มือ :

คีย์อาจเป็นจำนวนเต็มหรือสตริงก็ได้ ค่าสามารถเป็นประเภทใดก็ได้

นอกจากนี้การร่ายสำคัญต่อไปนี้จะเกิดขึ้น:

  • สตริงที่มีจำนวนเต็มที่ถูกต้องจะถูกเหวี่ยงเป็นประเภทจำนวนเต็ม เช่นคีย์ "8" จะถูกจัดเก็บไว้ภายใต้ 8 จริง ๆ ในทางกลับกัน "08" จะไม่ถูกส่งเนื่องจากไม่ใช่จำนวนเต็มทศนิยมที่ถูกต้อง
  • ลอยยังถูกโยนเป็นจำนวนเต็มซึ่งหมายความว่าส่วนที่เป็นเศษส่วนจะถูกตัดทอน เช่นคีย์ 8.7 จะถูกเก็บไว้ภายใต้ 8
  • Bools จะถูกส่งไปยังจำนวนเต็มเช่นกันนั่นคือคีย์จริงจะถูกเก็บไว้ภายใต้ 1 และคีย์เท็จภายใต้ 0
  • Null จะถูกส่งไปยังสตริงว่างนั่นคือค่าว่างของคีย์จะถูกเก็บไว้ภายใต้ ""
  • ไม่สามารถใช้อาร์เรย์และวัตถุเป็นคีย์ได้ การทำเช่นนี้จะได้รับคำเตือน: ประเภทออฟเซ็ตที่ไม่ถูกต้อง

คู่มืออีกครั้ง :

สตริงคือชุดของอักขระโดยที่อักขระจะเหมือนกับไบต์ ซึ่งหมายความว่า PHP รองรับชุดอักขระ 256 ตัวเท่านั้นและด้วยเหตุนี้จึงไม่มีการรองรับ Unicode แบบเนทีฟ ดูรายละเอียดประเภทสตริง

ดังนั้นในระยะสั้นสตริงใด ๆ ก็สามารถเป็นกุญแจสำคัญได้ และสตริงสามารถมีข้อมูลไบนารี (สูงสุด 2GB) ดังนั้นคีย์สามารถเป็นข้อมูลไบนารีใดก็ได้ (เนื่องจากสตริงสามารถเป็นข้อมูลไบนารีใดก็ได้)

การใช้คีย์อาร์เรย์แบบสุ่ม (ถูกต้อง):

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);

1
เพื่อชี้แจงไม่ได้หมายความว่าคุณไม่สามารถใช้สตริง Unicode เป็นคีย์อาร์เรย์ได้ ในความเป็นจริงสตริงไบนารีใด ๆก็ใช้ได้ดี ฉันพบว่าการขาดการสนับสนุน Unicode ที่อธิบายตัวเองของ PHP นั้นน่ารำคาญเนื่องจากไม่เป็นความจริง :)
deeze

1
@deceze Unicode อยู่ในหมวดหมู่ "ข้อมูลไบนารีใด ๆ " :) (แม้ว่าฉันจะเดาด้วยถ้อยคำของคู่มือ แต่ฉันคิดว่าจำเป็นต้องมีการชี้แจง) และการพูดว่า "ไม่รองรับ Unicode แบบเนทีฟ" ก็เพียงพอแล้ว มีแกน PHP ที่ไม่รวม strlen, substr และอื่น ๆ ในเวอร์ชัน Unicode แม้ว่า "ไม่ได้เสนอการประมวลผลสตริง Unicode แบบเนทีฟ" อาจเหมาะสมกว่า
Corbin

3
แน่นอนว่าแกนกลางไม่มีสิ่งอำนวยความสะดวกใด ๆ ในการจัดการกับสตริง Unicode แต่ตราบใดที่คุณไม่ต้องการจัดการสตริง PHP ก็รองรับได้ดี และพูดตามความเป็นจริงส่วนขยาย MB นั้นมีอยู่ในแทบทุกการติดตั้ง PHP ตามค่าเริ่มต้นดังนั้นความแตกต่างระหว่าง "การสนับสนุนหลัก" หรือไม่ส่วนใหญ่จึงเป็นเรื่องวิชาการ :)
deeze

1
@deceze บางทีโน้ตของพวกเขาควรอ่านว่า "ไม่ใช่แบบเนทีฟ (ดูนามสกุล mb)" หรือบางอย่าง คุณพูดถูกแล้ว การติดตั้ง PHP ใด ๆ ตั้งแต่ปี 2548 สนับสนุน Unicode เป็นหลักแม้ว่าฉันจะโต้แย้งว่าการสนับสนุน Unicode ใน PHP (พร้อมส่วนขยาย) ยังคงไม่เป็นที่พอใจ
Corbin

@ คอร์บินทำไมถึงเรียกว่าละเมิดแทนที่จะใช้ ?
Pacerier

12

คีย์ต้องเป็นสตริงหรือจำนวนเต็ม มีการแคสต์บางอย่างเกิดขึ้น แต่ฉันคิดว่าคู่มือนี้อธิบายได้ดี:

คีย์อาจเป็นจำนวนเต็มหรือสตริงก็ได้ ค่าสามารถเป็นประเภทใดก็ได้

นอกจากนี้การร่ายสำคัญต่อไปนี้จะเกิดขึ้น:

  • สตริงที่มีจำนวนเต็มที่ถูกต้องจะถูกเหวี่ยงเป็นประเภทจำนวนเต็ม เช่นคีย์ "8" จะถูกจัดเก็บไว้ภายใต้ 8 จริง ๆ ในทางกลับกัน "08" จะไม่ถูกส่งเนื่องจากไม่ใช่จำนวนเต็มทศนิยมที่ถูกต้อง
  • ลอยยังถูกโยนเป็นจำนวนเต็มซึ่งหมายความว่าส่วนที่เป็นเศษส่วนจะถูกตัดทอน เช่นคีย์ 8.7 จะถูกเก็บไว้ภายใต้ 8
  • Bools จะถูกส่งไปยังจำนวนเต็มเช่นกันนั่นคือคีย์จริงจะถูกเก็บไว้ภายใต้ 1 และคีย์เท็จภายใต้ 0
  • Null จะถูกส่งไปยังสตริงว่างนั่นคือค่าว่างของคีย์จะถูกเก็บไว้ภายใต้ ""
  • ไม่สามารถใช้อาร์เรย์และวัตถุเป็นคีย์ได้ การทำเช่นนี้จะได้รับคำเตือน: ประเภทออฟเซ็ตที่ไม่ถูกต้อง

ประเภททรัพยากรสามารถแคสต์เป็นจำนวนเต็มได้ในขณะนี้ (ไม่แน่ใจว่าเป็นคุณสมบัติใหม่หรือไม่) ดังนั้นคุณสามารถใช้เช่น file handle หรือ curl handle เป็นคีย์ทางอ้อมโดยการแคสต์เป็นจำนวนเต็มและใช้เป็นคีย์
thomasrutter

10

ฉันพบคำตอบนี้กำลังมองหาข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่ฉันมี ฉันใช้สตริงที่มีอักขระ UTF-8 อยู่ในนั้นซึ่งจะใช้ไม่ได้เป็นคีย์ของอาร์เรย์ที่ฉันมี

สิ่งที่ต้องการ

$str = "R&D - Solution";
$arr = array( "R&D - Solution" => "Research" );
echo $arr[$str];  // did not work

ทางออก (ไม่ใหญ่หรือฉลาด) สำหรับฉันคือทำสิ่งนี้ ..

$str = md5("R&D - Solution");
$arr = array( md5("R&D - Solution") => "Research" );
echo $arr[$str];  // works!

2
ฉันชอบ md5 () ในการสร้างคีย์อาร์เรย์ แม้ว่าจะไม่จำเป็นทั้งหมดในตอนนี้ แต่ก็ยังรู้สึกปลอดภัยกว่า
billynoah

2
คุณใช้ PHP เวอร์ชันเก่ากว่าหรือไม่ ตัวอย่างแรกของคุณทำงานได้ดีใน PHP 7.1
Elliot B.

bin2hexดีกว่าที่จะใช้เป็นสำคัญเพราะมันรับประกันได้ว่าจะไม่ซ้ำกันซึ่งแตกต่างและมักจะกลับไปที่เดิมโดยใช้md5 hex2binอาจเร็วกว่ามากmd5เช่นกัน
Patanjali

6

คีย์อาร์เรย์ PHP อาจเป็นจำนวนเต็มหรือสตริง สตริง PHP คืออาร์เรย์ไบต์ซึ่งหมายถึงลำดับของไบต์ ไม่มีสตริงประเภทอื่นและ PHP ไม่ได้กำหนดข้อ จำกัด พิเศษใด ๆ เกี่ยวกับสตริงคีย์อาร์เรย์ กล่าวอีกนัยหนึ่ง: ตราบใดที่มันเป็นสตริงอะไรก็จะไป


ฉันคิดว่าการโยนโดยนัยจากสตริงไปยังคีย์จำนวนเต็มเป็นความแตกต่างที่สำคัญในการสร้างเนื่องจากฟังก์ชันบางอย่างทำงานแตกต่างกันหากคีย์เป็นจำนวนเต็มหรือไม่ เช่นคุณสามารถใช้หมายเลขสตริงที่กำหนดเองเพื่อค้นหาว่าฟังก์ชันอาร์เรย์ในภายหลังสร้างดัชนีใหม่จาก 0..n-1
Matthew

1
เห็นด้วย แต่ฉันคิดว่ามันอยู่ในขอบเขตของขอบเขตของคำถามนี้ :)
deeze

5

ทุกสิ่งที่คุณสามารถใส่ลงในสตริง PHP สามารถใช้เป็นคีย์อาร์เรย์ได้ ไม่ จำกัด จำนวนอักขระที่อนุญาต

$a = array();

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

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

1

หากคีย์ที่ซับซ้อนทำให้เกิดข้อผิดพลาด "ดัชนีที่ไม่ได้กำหนด" คุณอาจมีปัญหา "ตัด"

ฉันรู้สึกไม่ดีเพราะคีย์ที่ซับซ้อนกำลังคายข้อผิดพลาด "ดัชนีที่ไม่ได้กำหนด" ออกมาและฉันคิดว่าอาจเป็นการละเมิดไวยากรณ์ คีย์อาร์เรย์ที่ทำให้เกิดข้อผิดพลาดถูกสร้างขึ้นจากฟิลด์จากแบบสอบถามฐานข้อมูล MySQL ที่ฉันกำลังแปลงเป็นคีย์และใช้ในอาร์เรย์ใหม่ คีย์มีลักษณะดังนี้pl_1DNKoiJKwotCqAycickBVhTyและนี่คือวิธีสร้างโค้ด

//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];

เมื่อในความเป็นจริง$keyvalและ$dbquery['fieldname']ดูเหมือนว่าจะเป็นคู่ที่สมบูรณ์แบบ (ตรวจสอบด้วยสายตาโดยสะท้อนทั้งสองไปยังเบราว์เซอร์) ความลึกลับได้รับการแก้ไขโดยใช้trimในคำสั่งที่สองเช่นนี้$keyval = trim($array_two['fieldname']);เมื่อ 'ตัด' แล้ว php จะไม่บ่นอีกต่อไป

หวังว่าสิ่งนี้จะช่วยคนอื่น ๆ จากช่วงเวลาที่น่าผิดหวัง ...


0

โดยส่วนตัวแล้วฉันไม่มีปัญหากับอักขระที่ผิดปกติในคีย์อาร์เรย์ สิ่งที่เป็นและไม่ถูกกฎหมายไม่ได้รับการจัดทำเป็นเอกสารอย่างดีนอกจากจะบอกว่าคีย์ต้องเป็นสเกลาร์ ทางออกที่ดีที่สุดของคุณคือลองใช้ดู


ไม่สอดคล้องกันเล็กน้อยใช่ แต่มีการบันทึกไว้อย่างดี
Corbin

0

นอกเหนือจากคำตอบทั้งหมดที่เป็นจริง: คุณสามารถใช้PSRซึ่งเป็นกฎบางอย่างระหว่างโปรแกรมเมอร์ที่ดีที่สุดเพื่อให้มีรูปแบบการเข้ารหัสที่ดีและเป็นมาตรฐาน



-1

เข้ารหัสหน้า php ใน ANSI "é" จะสามารถใช้งานได้ (Cinémaจะไม่แสดงเป็นCiné ma) ใน Notepad ++ เพียงใช้เมนู Encode => Convert ANSI และบันทึก


2
(ดูเหมือนว่าโพสต์นี้จะไม่ได้ให้คำตอบที่มีคุณภาพสำหรับคำถามโปรดแก้ไขคำตอบของคุณหรือเพียงแค่โพสต์เป็นความคิดเห็นสำหรับคำถาม)
sɐunıɔןɐqɐp

คุณช่วยอธิบายเพิ่มเติมได้ไหม จะเกิดอะไรขึ้นถ้าéOP ไม่ใช้ Notepad ++ หลังจากทั้งหมด?
Nico Haase
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.