OP에 명시된 바와 같이 :
PHP는 모든 배열을 연관성으로 취급합니다
배열이 연관 되어 있는지 확인하는 함수를 작성하는 것은 합리적이지 않습니다 (IMHO) . 먼저 가장 먼저 : PHP 배열의 키는 무엇 입니까? :
키는 어느 쪽이 될 수 정수 또는 문자열 .
이는 가능한 세 가지 경우가 있음을 의미합니다.
- 사례 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 단계 씩 증가).
- 키 는 0부터 시작합니다 .
이하의 기능으로 확인할 수 있습니다.
사례 3a. 키는 숫자 / 정수 , 순차 및 0부터 시작합니다 .
참고 : 이 함수는 빈 배열에 대해서도 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")
A는 문자열 , 당신은 잘못입니다 . 문서 에서 여기 :
유효한 정수를 포함하는 문자열은 정수 유형으로 캐스트됩니다. 예를 들어 "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 참조 ). 예를 들어, (윈도우 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"
}
따라서 키는 유효한 부호있는 32 비트 정수 이지만 한 환경 에서는 정수 이지만 다른 환경에서는 문자열 입니다 .2147483647