Như tuyên bố của OP :
PHP coi tất cả các mảng là liên kết
Nó không hoàn toàn hợp lý (IMHO) để viết một hàm kiểm tra xem một mảng có liên quan hay không . Vì vậy, điều đầu tiên trước tiên: khóa trong mảng PHP là gì ?:
Các chính hoặc có thể là một số nguyên hoặc một chuỗi .
Điều đó có nghĩa là có 3 trường hợp có thể xảy ra:
- Trường hợp 1. tất cả các khóa là số / số nguyên .
- Trường hợp 2. tất cả các khóa là chuỗi .
- Trường hợp 3. một số khóa là chuỗi , một số khóa là số / số nguyên .
Chúng ta có thể kiểm tra từng trường hợp với các chức năng sau.
Trường hợp 1: tất cả các khóa là số / số nguyên .
Lưu ý : Hàm này cũng trả về true cho các mảng trống.
//! 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);
}
Trường hợp 2: tất cả các khóa là chuỗi .
Lưu ý : Hàm này cũng trả về true cho các mảng trống.
//! 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);
}
Trường hợp 3. một số khóa là chuỗi , một số khóa là số / số nguyên .
Lưu ý : Hàm này cũng trả về true cho các mảng trống.
//! 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;
}
Nó theo sau:
Bây giờ, để một mảng là một mảng "chính hãng" mà tất cả chúng ta đều quen thuộc, có nghĩa là:
- Các khóa của nó là tất cả số / số nguyên .
- Các khóa của nó là tuần tự (tức là tăng theo bước 1).
- Các phím của nó bắt đầu từ số không .
Chúng ta có thể kiểm tra với chức năng sau.
Trường hợp 3a. các khóa là số / số nguyên , tuần tự và không dựa trên .
Lưu ý : Hàm này cũng trả về true cho các mảng trống.
//! 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);
}
Hãy cẩn thận / Cạm bẫy (hoặc, thậm chí nhiều sự thật đặc biệt hơn về các khóa mảng trong PHP)
Phím số nguyên
Các khóa cho các mảng này là số nguyên :
array(0 => "b");
array(13 => "b");
array(-13 => "b"); // Negative integers are also integers.
array(0x1A => "b"); // Hexadecimal notation.
Phím chuỗi
Các khóa cho các mảng này là các chuỗi :
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!
Các khóa số nguyên trông giống như các chuỗi
Nếu bạn nghĩ rằng khóa trong array("13" => "b")
là một chuỗi , bạn đã sai . Từ tài liệu ở đây :
Các chuỗi chứa số nguyên hợp lệ sẽ được chuyển sang loại số nguyên. Ví dụ, khóa "8" sẽ thực sự được lưu trữ dưới 8. Mặt khác, "08" sẽ không được sử dụng, vì đó không phải là số nguyên thập phân hợp lệ.
Ví dụ, khóa cho các mảng này là số nguyên :
array("13" => "b");
array("-13" => "b"); // Negative, ok.
Nhưng chìa khóa cho các mảng này là các chuỗi :
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.
Hơn nữa, theo tài liệu ,
Kích thước của một số nguyên phụ thuộc vào nền tảng, mặc dù giá trị tối đa khoảng hai tỷ là giá trị thông thường (đó là 32 bit được ký). Các nền tảng 64 bit thường có giá trị tối đa khoảng 9E18, ngoại trừ Windows, luôn là 32 bit. PHP không hỗ trợ số nguyên không dấu.
Vì vậy, khóa cho mảng này có thể có hoặc không phải là số nguyên - nó phụ thuộc vào nền tảng của bạn.
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
Thậm chí tệ hơn, PHP có xu hướng bị lỗi nếu số nguyên ở gần ranh giới 2 31 = 2.147.483.648 (xem lỗi 51430 , lỗi 52899 ). Ví dụ: trên môi trường cục bộ của tôi (PHP 5.3.8 trên XAMPP 1.7.7 trên Windows 7), var_dump(array("2147483647" => "b"))
sẽ cho
array(1) {
[2147483647]=>
string(1) "b"
}
nhưng trên bản demo trực tiếp này trên codepad (PHP 5.2.5), cùng một biểu thức cho
array(1) {
["2147483647"]=>
string(1) "b"
}
Vì vậy, khóa là một số nguyên trong một môi trường nhưng một chuỗi trong một môi trường khác, mặc dù 2147483647
là một số nguyên 32 bit được ký hợp lệ .