以下のようOPで述べました:
PHPはすべての配列を連想配列として扱います
配列が連想であるかどうかをチェックする関数を書くことは、あまり賢明ではありません(IMHO)。まず最初に、PHP配列のキーは何ですか?:
キーは、のいずれかになります、整数または文字列。
つまり、次の3つのケースが考えられます。
- ケース1.すべてのキーが数値 / 整数です。
- ケース2.すべてのキーが文字列です。
- ケース3.一部のキーは文字列であり、一部のキーは数値 / 整数です。
それぞれのケースを以下の機能で確認できます。
ケース1:すべてのキーが数値 / 整数です。
注:この関数は、空の配列に対してもtrueを返します。
//! 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:すべてのキーが文字列です。
注:この関数は、空の配列に対してもtrueを返します。
//! 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.一部のキーは文字列であり、一部のキーは数値 / 整数です。
注:この関数は、空の配列に対してもtrueを返します。
//! 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で増加します)。
- キーはゼロから始まります。
以下の機能で確認できます。
ケース3a。キーは、数値 / 整数、シーケンシャル、ゼロベースです。
注:この関数は、空の配列に対してもtrueを返します。
//! 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」は有効な10進整数ではないため、キャストされません。
たとえば、これらの配列のキーは整数です:
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.
さらに、ドキュメントによると、
整数のサイズはプラットフォームに依存しますが、最大値である約20億が通常の値(32ビットの符号付き)です。64ビットのプラットフォームの最大値は通常、約32ビットであるWindowsを除いて、約9E18です。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の境界に近い場合、PHPはバグが多い傾向があります(バグ51430、バグ52899を参照)。例えば、私のローカル環境(Windows 7でXAMPP 1.7.7のPHP 5.3.8)で、与えvar_dump(array("2147483647" => "b"))
array(1) {
[2147483647]=>
string(1) "b"
}
しかし、上codepadでこのライブデモ(PHP 5.2.5)、同じ式が与えられます
array(1) {
["2147483647"]=>
string(1) "b"
}
したがって、ある環境ではキーは整数ですが、別の環境では文字列です2147483647
が、有効な符号付き32ビット整数です。