ตามที่ระบุโดย OP :
PHP ถือว่าอาร์เรย์ทั้งหมดเป็นแบบเชื่อมโยง
มันไม่สมเหตุสมผล (IMHO) ในการเขียนฟังก์ชั่นที่ตรวจสอบว่าอาร์เรย์มีความสัมพันธ์หรือไม่ ดังนั้นสิ่งแรกแรก: สิ่งที่เป็นกุญแจสำคัญในอาร์เรย์ PHP ได้หรือ ?
สำคัญทั้งสามารถเป็นจำนวนเต็มหรือสตริง
นั่นหมายความว่ามี 3 กรณีที่เป็นไปได้:
- กรณีที่ 1. คีย์ทั้งหมดเป็นตัวเลข / จำนวนเต็ม
- กรณีที่ 2. คีย์ทั้งหมดเป็นสตริง
- กรณี 3. ปุ่มบางอย่างจะสาย , กุญแจบางคนที่เป็นตัวเลข / จำนวนเต็ม
เราสามารถตรวจสอบแต่ละกรณีด้วยฟังก์ชั่นต่อไปนี้
กรณีที่ 1: ปุ่มทั้งหมดเป็นตัวเลข / จำนวนเต็ม
หมายเหตุ : ฟังก์ชั่นนี้จะคืนค่าจริงสำหรับอาร์เรย์ว่างเช่นกัน
//! Check whether the input is an array whose keys are all integers.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array whose keys are all integers.
*/
function IsArrayAllKeyInt($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return array_unique(array_map("is_int", array_keys($InputArray))) === array(true);
}
กรณีที่ 2: ปุ่มทั้งหมดเป็นสตริง
หมายเหตุ : ฟังก์ชั่นนี้จะคืนค่าจริงสำหรับอาร์เรย์ว่างเช่นกัน
//! Check whether the input is an array whose keys are all strings.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array whose keys are all strings.
*/
function IsArrayAllKeyString($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return array_unique(array_map("is_string", array_keys($InputArray))) === array(true);
}
กรณี 3. ปุ่มบางอย่างจะสาย , กุญแจบางคนที่เป็นตัวเลข / จำนวนเต็ม
หมายเหตุ : ฟังก์ชั่นนี้จะคืนค่าจริงสำหรับอาร์เรย์ว่างเช่นกัน
//! Check whether the input is an array with at least one key being an integer and at least one key being a string.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array with at least one key being an integer and at least one key being a string.
*/
function IsArraySomeKeyIntAndSomeKeyString($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return count(array_unique(array_map("is_string", array_keys($InputArray)))) >= 2;
}
มันตามมาว่า:
- หากมีค่าเป็นไม่ได้เป็นอาเรย์ , ทั้ง 3ฟังก์ชั่นกลับเท็จ
- หากมีค่าเป็นอาร์เรย์ที่ว่างเปล่า , ทั้ง 3ฟังก์ชั่นกลับมาจริง
(ซึ่งโดยความหมายในขณะที่ " เซตว่างเป็นส่วนหนึ่งของชุดใด ๆเพราะทุกองค์ประกอบอยู่ ")
- หากมีค่าเป็นอาร์เรย์ที่ไม่ว่างเปล่า , ว่า 1ฟังก์ชั่นผลตอบแทนที่แท้จริง
ตอนนี้สำหรับอาร์เรย์ที่จะเป็นอาร์เรย์ "ของแท้"ที่เราทุกคนคุ้นเคย
- คีย์ของมันคือทั้งหมดที่เป็นตัวเลข / จำนวนเต็ม
- คีย์ของมันเป็นลำดับ (เช่นเพิ่มขึ้นขั้นตอนที่ 1)
- ปุ่มมันเริ่มต้นจากศูนย์
เราสามารถตรวจสอบด้วยฟังก์ชั่นดังต่อไปนี้
กรณีที่ 3a คีย์จะเป็นตัวเลข / จำนวนเต็ม , ลำดับและzero-based
หมายเหตุ : ฟังก์ชั่นนี้จะคืนค่าจริงสำหรับอาร์เรย์ว่างเช่นกัน
//! Check whether the input is an array whose keys are numeric, sequential, and zero-based.
/*!
\param[in] $InputArray (array) Input array.
\return (bool) \b true iff the input is an array whose keys are numeric, sequential, and zero-based.
*/
function IsArrayKeyNumericSequentialZeroBased($InputArray)
{
if(!is_array($InputArray))
{
return false;
}
if(count($InputArray) <= 0)
{
return true;
}
return array_keys($InputArray) === range(0, count($InputArray) - 1);
}
Caveats / Pitfalls (หรือข้อเท็จจริงที่แปลกประหลาดยิ่งขึ้นเกี่ยวกับคีย์อาร์เรย์ใน PHP)
ปุ่มจำนวนเต็ม
กุญแจสำหรับอาร์เรย์เหล่านี้เป็นจำนวนเต็ม :
array(0 => "b");
array(13 => "b");
array(-13 => "b"); // Negative integers are also integers.
array(0x1A => "b"); // Hexadecimal notation.
คีย์สตริง
กุญแจสำหรับอาร์เรย์เหล่านี้คือสตริง :
array("fish and chips" => "b");
array("" => "b"); // An empty string is also a string.
array("stackoverflow_email@example.com" => "b"); // Strings may contain non-alphanumeric characters.
array("stack\t\"over\"\r\nflow's cool" => "b"); // Strings may contain special characters.
array('$tα€k↔øv∈rflöw⛄' => "b"); // Strings may contain all kinds of symbols.
array("functіon" => "b"); // You think this looks fine? Think again! (see https://stackoverflow.com/q/9246051/1402846)
array("ま말轉转ДŁ" => "b"); // How about Japanese/Korean/Chinese/Russian/Polish?
array("fi\x0sh" => "b"); // Strings may contain null characters.
array(file_get_contents("https://www.google.com/images/nav_logo114.png") => "b"); // Strings may even be binary!
ปุ่มจำนวนเต็มที่มีลักษณะเหมือนสตริง
หากคุณคิดว่าสำคัญในการarray("13" => "b")
เป็นสตริง , คุณผิด จากเอกสารที่นี่ :
สตริงที่มีจำนวนเต็มที่ถูกต้องจะถูกส่งไปยังประเภทจำนวนเต็ม เช่นคีย์ "8" จะถูกเก็บไว้ที่ต่ำกว่า 8 ในทางกลับกัน "08" จะไม่ถูกโยนเนื่องจากไม่ใช่จำนวนเต็มทศนิยมที่ถูกต้อง
ตัวอย่างเช่นคีย์สำหรับอาร์เรย์เหล่านี้คือจำนวนเต็ม :
array("13" => "b");
array("-13" => "b"); // Negative, ok.
แต่กุญแจสำหรับอาร์เรย์เหล่านี้คือสตริง :
array("13." => "b");
array("+13" => "b"); // Positive, not ok.
array("-013" => "b");
array("0x1A" => "b"); // Not converted to integers even though it's a valid hexadecimal number.
array("013" => "b"); // Not converted to integers even though it's a valid octal number.
array("18446744073709551616" => "b"); // Not converted to integers as it can't fit into a 64-bit integer.
มีอะไรเพิ่มเติมตามdoc ,
ขนาดของจำนวนเต็มขึ้นอยู่กับแพลตฟอร์มแม้ว่าค่าสูงสุดประมาณสองพันล้านเป็นค่าปกติ (ที่ลงนาม 32 บิต) โดยทั่วไปแพลตฟอร์ม 64 บิตจะมีค่าสูงสุดประมาณ 9E18 ยกเว้นสำหรับ Windows ซึ่งเป็น 32 บิตเสมอ PHP ไม่รองรับจำนวนเต็มที่ไม่ได้ลงนาม
ดังนั้นคีย์สำหรับอาเรย์นี้อาจเป็นหรือไม่เป็นจำนวนเต็มก็ได้ขึ้นอยู่กับแพลตฟอร์มของคุณ
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
แม้เลว, PHP มีแนวโน้มที่จะรถถ้าจำนวนเต็มอยู่ใกล้ 2 31 = 2,147,483,648 เขตแดน (ดูข้อผิดพลาด 51430 , ข้อผิดพลาด 52899 ) ตัวอย่างเช่นในสภาพแวดล้อมท้องถิ่นของฉัน (PHP 5.3.8 บน XAMPP 1.7.7 บน Windows 7) var_dump(array("2147483647" => "b"))
ให้
array(1) {
[2147483647]=>
string(1) "b"
}
แต่ในการสาธิตสดนี้บนแผ่นจดบันทึก (PHP 5.2.5) การแสดงออกเดียวกันให้
array(1) {
["2147483647"]=>
string(1) "b"
}
ดังนั้นที่สำคัญเป็นจำนวนเต็มในสภาพแวดล้อมหนึ่ง แต่สตริงอีกแม้ว่าจะ2147483647
เป็นที่ถูกต้องลงนาม 32 บิตจำนวนเต็ม