PHP 개발에서 Array_change_key_case ()는 배열의 모든 키 이름을 대문자 또는 소문자로 변환 할 수있는 매우 편리한 기능입니다. 그러나 당신은 알고 있습니까?
특정 예를 들어이 문제가 어떻게 발생하는지 살펴 보겠습니다.
array_change_key_case(array $array, int $case = CASE_LOWER): array
$ 배열 : 입력 배열.
$ CASE : 선택적 매개 변수, 기본값은 Case_Lower (소문자) 또는 Case_Upper (대문자)로 설정할 수 있습니다.
$data = [
'Name' => 'Alice',
'name' => 'Bob',
'Age' => 25,
];
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
Array
(
[name] => Bob
[age] => 25
)
당신은 그것을 보셨습니까? '이름'=> 'Alice' 가 사라졌습니다!
이는 '이름' 과 '이름' 이 소문자로 변환 된 후 '이름' 이되어 '앨리스'가 '밥' 에 의해 덮어 쓰여 있기 때문입니다!
Array_change_key_case ()는 "케이스가 다르지만 실제로는 동일한"키 이름이 있는지 여부를 감지하지 못하며, 키 이름을 상류 및 소문자로 간단히 대체합니다 . 충돌이 발생하면 뒤에서 키가 전면 키를 덮어 쓰고 경고 나 오류도받지 못합니다.
여러 소스에서 데이터를 처리 할 때 특히 위험합니다. 예를 들어, 양식 병합 또는 API 병합을 수행 할 때 키 이름 간의 사례 충돌을 인식하지 못하면 데이터가 무의식적으로 손실됩니다.
array_change_key_case ()를 호출하기 전에 먼저 원래 배열에 키 이름 케이스 충돌이 있는지 여부를 감지 할 수 있습니다.
function hasKeyCaseConflict(array $array): bool {
$lowerKeys = [];
foreach ($array as $key => $value) {
$lower = strtolower($key);
if (isset($lowerKeys[$lower])) {
return true;
}
$lowerKeys[$lower] = true;
}
return false;
}
$data = [
'Name' => 'Alice',
'name' => 'Bob',
];
if (hasKeyCaseConflict($data)) {
echo "키 이름 사이에는 사례 충돌이 있습니다,변환하기 전에 처리하십시오。";
} else {
$result = array_change_key_case($data);
print_r($result);
}
API를 통해 가져온 컨텐츠와 같은 외부 데이터를 처리하는 경우 병합 전에 데이터를 표준화하거나 키 이름 규칙을 지정할 수 있습니다.
$apiData = json_decode(file_get_contents('https://m66.net/api/user'), true);
// 소스가 신뢰할 수 있다고 가정합니다,통일 된 소문자로 사용하십시오
$safeData = array_change_key_case($apiData, CASE_LOWER);
Array_change_key_case () 는 간단하고 실용적인 기능이지만 잠재적 파괴성을 무시할 수는 없습니다. 처리중인 데이터에 키 이름이 복제 될 수있는 경우, 수행하기 전에 두 번 생각하십시오!
기본 동작은 충돌을 유발하지 않습니다!
"조용히"데이터를 덮어 쓸 수 있습니다!
데이터 통합 시나리오가 많을수록 사용해야합니다.