जैसा कि ओपी ने कहा है :
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;
}
यह इस प्रकार है कि:
अब, "वास्तविक" सरणी होने के लिए एक सरणी के लिए जिसका हम सभी आदी हैं, जिसका अर्थ है:
- इसकी कुंजियाँ सभी संख्यात्मक / पूर्णांक हैं ।
- इसकी चाबियाँ अनुक्रमिक हैं (अर्थात चरण 1 से बढ़ रही है)।
- इसकी चाबियां शून्य से शुरू होती हैं ।
हम निम्नलिखित फ़ंक्शन से जांच कर सकते हैं।
केस 3 ए। चाबियाँ संख्यात्मक / पूर्णांक , अनुक्रमिक और शून्य-आधारित हैं ।
नोट : यह फ़ंक्शन खाली सरणियों के लिए भी सही है।
//! 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);
}
कैविट्स / नुकसान (या, 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.
क्या, और भी है के अनुसार दस्तावेज़ ,
एक पूर्णांक का आकार प्लेटफ़ॉर्म-निर्भर है, हालांकि लगभग दो बिलियन का अधिकतम मूल्य सामान्य मूल्य है (जो कि 32 बिट्स पर हस्ताक्षर किया गया है)। 64-बिट प्लेटफ़ॉर्म में आमतौर पर विंडोज के अलावा, 9E18 का अधिकतम मूल्य होता है, जो हमेशा 32 बिट होता है। PHP अहस्ताक्षरित पूर्णांक का समर्थन नहीं करता है।
तो इस सरणी की कुंजी पूर्णांक हो सकती है या नहीं भी हो सकती है - यह आपके प्लेटफ़ॉर्म पर निर्भर करता है।
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
इससे भी बदतर, अगर पूर्णांक 2 31 = 2,147,483,648 सीमा ( बग 51430 , बग 52899 देखें ) के पास है , तो PHP छोटी गाड़ी होती है । उदाहरण के लिए, मेरे स्थानीय वातावरण पर (विंडोज 7 पर XAMPP 1.7.7 पर PHP 5.3.8), देता हैvar_dump(array("2147483647" => "b"))
array(1) {
[2147483647]=>
string(1) "b"
}
लेकिन कोडपैड (PHP 5.2.5) पर इस लाइव डेमो पर , वही अभिव्यक्ति देता है
array(1) {
["2147483647"]=>
string(1) "b"
}
तो कुंजी एक पर्यावरण में एक पूर्णांक है , लेकिन दूसरे में एक स्ट्रिंग है, भले ही 2147483647
एक वैध हस्ताक्षरित 32-बिट पूर्णांक है ।