OP tarafından belirtildiği gibi :
PHP tüm dizileri birleştirici olarak ele alır
bir dizinin ilişkilendirilebilir olup olmadığını kontrol eden bir işlev yazmak oldukça mantıklı değildir (IMHO) . İlk önce: PHP dizisindeki anahtar nedir ?:
Anahtar ya bir olabilir tamsayı veya bir dize .
Bu, 3 olası durum olduğu anlamına gelir:
- Durum 1. tüm tuşlar sayısal / tamsayılardır .
- Durum 2. tüm anahtarlar dizgidir .
- Durum 3. bazı anahtarlar dize , bazı anahtarlar sayısal / tamsayılar .
Her bir durumu aşağıdaki işlevlerle kontrol edebiliriz.
Durum 1: tüm tuşlar sayısal / tamsayılardır .
Not : Bu işlev boş diziler için de doğru değerini döndürür .
//! 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);
}
Durum 2: tüm tuşlar dizedir .
Not : Bu işlev boş diziler için de doğru değerini döndürür .
//! 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);
}
Durum 3. bazı anahtarlar dize , bazı anahtarlar sayısal / tamsayılar .
Not : Bu işlev boş diziler için de doğru değerini döndürür .
//! 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;
}
Şunu izler:
Şimdi, bir dizinin hepimizin alışkın olduğu "orijinal" bir dizi olması, yani:
- Anahtarları tamamen sayısal / tamsayılardır .
- Anahtarları sıralı (yani adım 1 artarak).
- Anahtarları sıfırdan başlar .
Aşağıdaki fonksiyon ile kontrol edebiliriz.
Durum 3a. anahtarlar sayısal / tamsayılar , sıralı ve sıfır tabanlıdır .
Not : Bu işlev boş diziler için de doğru değerini döndürür .
//! 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);
}
Uyarılar / Tuzaklar (veya PHP'deki dizi anahtarları hakkında daha da tuhaf gerçekler)
Tam sayı tuşları
Bu dizilerin anahtarları tamsayılardır :
array(0 => "b");
array(13 => "b");
array(-13 => "b"); // Negative integers are also integers.
array(0x1A => "b"); // Hexadecimal notation.
Dize tuşları
Bu dizilerin anahtarları dizedir :
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!
Dizgiye benzeyen tamsayı tuşları
Eğer anahtar düşünüyorsanız array("13" => "b")bir olduğunu dize , yanılıyorsunuz . Buradaki dokümandan :
Geçerli tamsayılar içeren dizeler tamsayı türüne dönüştürülür. Örneğin, "8" tuşu 8'in altında saklanacaktır. Öte yandan "08" geçerli bir ondalık tam sayı olmadığından kullanılmayacaktır.
Örneğin, bu dizilerin anahtarı tamsayılardır :
array("13" => "b");
array("-13" => "b"); // Negative, ok.
Ancak bu dizilerin anahtarı dizelerdir :
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.
Dahası, dokümana göre ,
Bir tamsayının boyutu platforma bağlıdır, ancak yaklaşık iki milyarlık bir maksimum değer olağan değerdir (32 bit imzalı). 64 bit platformlar, genellikle her zaman 32 bit olan Windows hariç maksimum 9E18 değerine sahiptir. PHP imzasız tam sayıları desteklemez.
Bu nedenle, bu dizinin anahtarı bir tamsayı olabilir veya olmayabilir - platformunuza bağlıdır.
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
Daha da kötüsü, PHP buggy olma eğilimindedir tam sayı 2 31 = 2.147.483.648 sınırına yakınsa (bkz. Hata 51430 , hata 52899 ). Örneğin, (Windows 7 üzerinde XAMPP 1.7.7 PHP 5.3.8) benim yerel çevre üzerindeki, var_dump(array("2147483647" => "b"))verir
array(1) {
[2147483647]=>
string(1) "b"
}
ancak kod pedindeki bu canlı demoda (PHP 5.2.5), aynı ifade
array(1) {
["2147483647"]=>
string(1) "b"
}
Anahtar bir ortamda bir tamsayı ama bir dize2147483647 geçerli bir imzalı 32 bit tam sayı olsa da , .