Sebagaimana dinyatakan oleh OP :
PHP memperlakukan semua array sebagai asosiatif
itu tidak cukup masuk akal (IMHO) untuk menulis fungsi yang memeriksa apakah array asosiatif . Jadi hal pertama yang pertama: apa yang merupakan kunci dalam array PHP ?:
The key baik dapat menjadi bilangan bulat atau tali .
Itu berarti ada 3 kemungkinan kasus:
- Kasus 1. semua kunci adalah angka / bilangan bulat .
- Kasus 2. semua kunci string .
- Kasus 3. beberapa kunci adalah string , beberapa kunci adalah numerik / bilangan bulat .
Kami dapat memeriksa setiap kasus dengan fungsi-fungsi berikut.
Kasus 1: semua kunci berupa angka / bilangan bulat .
Catatan : Fungsi ini mengembalikan true untuk array kosong juga.
//! 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);
}
Kasus 2: semua kunci adalah string .
Catatan : Fungsi ini mengembalikan true untuk array kosong juga.
//! 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);
}
Kasus 3. beberapa kunci adalah string , beberapa kunci adalah numerik / bilangan bulat .
Catatan : Fungsi ini mengembalikan true untuk array kosong juga.
//! 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;
}
Oleh karena itu:
Sekarang, untuk sebuah array menjadi array "asli" yang kita semua terbiasa, artinya:
- Kuncinya semua numerik / bilangan bulat .
- Kuncinya berurutan (yaitu meningkat pada langkah 1).
- Kuncinya mulai dari nol .
Kami dapat memeriksa dengan fungsi berikut.
Kasus 3a. kunci numerik / bilangan bulat , berurutan , dan berbasis nol .
Catatan : Fungsi ini mengembalikan true untuk array kosong juga.
//! 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);
}
Peringatan / Kesalahan (atau, fakta lebih aneh tentang kunci array di PHP)
Kunci integer
Kunci untuk array ini adalah bilangan bulat :
array(0 => "b");
array(13 => "b");
array(-13 => "b"); // Negative integers are also integers.
array(0x1A => "b"); // Hexadecimal notation.
Kunci dawai
Kunci untuk array ini adalah string :
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!
Kunci integer yang terlihat seperti string
Jika Anda pikir kunci dalam array("13" => "b")
adalah string , Anda salah . Dari dokumen di sini :
String yang berisi bilangan bulat yang valid akan dilemparkan ke tipe bilangan bulat. Misalnya kunci "8" sebenarnya akan disimpan di bawah 8. Di sisi lain "08" tidak akan dilemparkan, karena itu bukan bilangan bulat desimal yang valid.
Misalnya, kunci untuk array ini adalah bilangan bulat :
array("13" => "b");
array("-13" => "b"); // Negative, ok.
Tetapi kunci untuk array ini adalah string :
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.
Terlebih lagi, menurut dokter ,
Ukuran integer tergantung pada platform, meskipun nilai maksimum sekitar dua miliar adalah nilai biasa (yang 32 bit ditandatangani). Platform 64-bit biasanya memiliki nilai maksimum sekitar 9E18, kecuali untuk Windows, yang selalu 32 bit. PHP tidak mendukung bilangan bulat yang tidak ditandatangani.
Jadi kunci untuk array ini mungkin atau tidak mungkin menjadi bilangan bulat - itu tergantung pada platform Anda.
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
Lebih buruk lagi, PHP cenderung bermasalah jika integer mendekati angka 2 31 = 2.147.483.648 (lihat bug 51430 , bug 52899 ). Sebagai contoh, pada lingkungan lokal saya (PHP 5.3.8 pada XAMPP 1.7.7 pada Windows 7), var_dump(array("2147483647" => "b"))
berikan
array(1) {
[2147483647]=>
string(1) "b"
}
tetapi pada demo langsung ini pada codepad (PHP 5.2.5), ekspresi yang sama memberikan
array(1) {
["2147483647"]=>
string(1) "b"
}
Jadi kuncinya adalah integer di satu lingkungan tetapi string di yang lain, meskipun 2147483647
adalah 32-bit yang ditandatangani integer .