如《任择议定书》所述:
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”将不是强制转换,因为它不是有效的十进制整数。
例如,这些数组的键是整数:
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位平台的最大值通常约为9E18(Windows始终为32位)。PHP不支持无符号整数。
因此,此数组的键可以是整数,也可以不是整数 -这取决于您的平台。
array("60000000000" => "b"); // Array key could be integer or string, it can fit into a 64-bit (but not 32-bit) integer.
更糟的是,PHP趋向于车如果整数是2的附近31 = 2,147,483,648边界(参见错误51430,错误52899)。例如,在(在Windows 7 PHP 5.3.8上XAMPP 1.7.7)我当地的环境,var_dump(array("2147483647" => "b"))
让
array(1) {
[2147483647]=>
string(1) "b"
}
但在此使用键盘的现场演示(PHP 5.2.5)上,相同的表达式给出了
array(1) {
["2147483647"]=>
string(1) "b"
}
因此,密钥是一个环境中的整数,而在另一个环境中则是字符串,即使它2147483647
是有效的带符号的32位整数。