php에서 array_flip () 는 매우 실용적인 기능입니다. 그 기능은 배열에서 키와 값을 교환하는 것입니다.
array_flip(array $array): array
원래 배열의 값을 키로 사용하고 원래 키를 값으로 사용하여 새 배열을 반환합니다. 그러나 배열의 값이 자원 유형 ** 인 경우 상황이 다소 미묘 해집니다.
PHP에서 리소스는 데이터베이스 연결, 열린 파일 핸들, 이미지 리소스 등과 같은 외부 리소스에 대한 참조를 나타내는 데 사용되는 특수 변수입니다.
$fp = fopen('http://m66.net/sample.txt', 'r');
var_dump($fp);
// 출력은 비슷합니다:resource(3) of type (stream)
이것은 문자열, 정수, 부동 소수점 번호 또는 배열이 아니라 PHP에서 내부적으로 사용되는 참조 유형이며 문자열이나 숫자가 필요한 대부분의 상황에서 직접 사용할 수 없습니다.
자원 유형 값이 포함 된 배열에서 Array_flip ()를 사용하려고하면 PHP는 이러한 값을 새로운 배열의 키로 문자열로 변환하려고합니다. 그러나 리소스 유형은 명시적이고 일관된 방식으로 문자열로 변환 할 수 없습니다. 이것은 몇 가지 문제를 일으킬 수 있습니다.
실질적인 예를 살펴 보겠습니다.
$fp1 = fopen('http://m66.net/file1.txt', 'r');
$fp2 = fopen('http://m66.net/file2.txt', 'r');
$arr = [
'file1' => $fp1,
'file2' => $fp2,
];
$flipped = array_flip($arr);
print_r($flipped);
키로 키가있는 배열을 리소스와 값으로 원래 키로 출력 할 것으로 예상 될 수 있습니다. 그러나 실제로 Array_flip ()는 자원 유형을 "Resource ID #3" 과 같은 문자열 형식으로 리소스 ID로 변환합니다 .
Array
(
[Resource id #3] => file1
[Resource id #4] => file2
)
리소스 ID는 동적으로 할당되며 다른 요청, 다른 기계 및 다른 런타임에서 다른 ID를 얻을 수 있습니다. 이는 뒤집힌 배열이 일관성을 보장 할 수 없으며 캐시 또는 해시 비교와 같은 결정 론적 키가 필요한 작업에 사용할 수 없음을 의미합니다.
여러 리소스를 사용하지만 문자열 변환 후 일부 리소스가 일관되게되면 (드물지만) 주요 충돌이 발생할 수 있습니다. Array_flip ()는 마지막 값 만 유지하면 나머지는 덮어 씁니다.
Array_flip () 는 이론적으로 가역적이지만 (즉, 배열 배열의 원래 상태를 복원합니다) 리소스의 문자열 표현은 환원 가능하지 않기 때문에이 프로세스는 원래 자원 변수로 복원 할 수 없습니다.
배열을 뒤집어야하는 경우 값이 문자열 또는 정수 유형인지 확인하십시오 . 자원이 포함 된 배열의 경우 Array_flip ()를 직접 사용해서는 안됩니다. 실행 가능한 대안은 예를 들어 매핑 테이블을 직접 구성하는 것입니다.