php에서 array_change_key_case () 함수는 배열의 키 이름을 소문자 또는 대문자로 변환하는 데 사용됩니다. 이것은 일관되지 않은 키 이름, 특히 API 또는 양식과 같은 외부 데이터 소스에서 데이터를 가져 오는 시나리오에서 일관성없는 키 이름을 다룰 때 유용합니다.
그러나 일반적인 문제가 발생할 수 있습니다. 케이스를 변환 할 때 키 이름이 복제되어 데이터를 덮어 쓸 수 있습니다 . 이는 특히 사용자 제출 매개 변수, 구성 파일 또는 JSON 데이터와 같은 불규칙한 키 이름을 가진 데이터 소스를 처리 할 때 데이터 손실의 위험이 있습니다.
간단한 예를 살펴 보겠습니다.
$data = [
'UserID' => 123,
'userid' => 456
];
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
산출:
Array
(
[userid] => 456
)
보시다시피, 원래 배열의 'userID' 및 'userID' 가 균일 한 소문자 인 후에 키 이름 충돌이 발생하며 결과는 후자의 값 만 유지되고 전자는 덮어 쓴 것입니다.
한 가지 방법은 키 이름의 경우를 통합하기 전에 가능한 충돌을 감지하고 해당 처리를 수행하는 것입니다.
function safe_change_key_case(array $array, int $case = CASE_LOWER): array {
$seen = [];
$result = [];
foreach ($array as $key => $value) {
$transformedKey = ($case === CASE_LOWER) ? strtolower($key) : strtoupper($key);
if (isset($seen[$transformedKey])) {
// 키 이름 충돌,처리 전략:뛰어 올라 / 병합 / 던지기 예외 등
echo "Warning: Key '{$key}' conflicts with '{$seen[$transformedKey]}'.\n";
continue;
}
$seen[$transformedKey] = $key;
$result[$transformedKey] = $value;
}
return $result;
}
// 시험
$data = [
'UserID' => 123,
'userid' => 456
];
$result = safe_change_key_case($data);
print_r($result);
로깅, 예외 또는 데이터 병합과 같은 특정 비즈니스 요구에 따라 충돌이 발견 될 때 취급 전략을 결정할 수 있습니다.
키 가치를 잃는 것을 견딜 수 없다면 모든 정보를보다 구조화 된 방식으로 저장할 수 있습니다.
$data = [
'UserID' => 123,
'userid' => 456
];
$transformed = [];
foreach ($data as $key => $value) {
$lowerKey = strtolower($key);
if (!isset($transformed[$lowerKey])) {
$transformed[$lowerKey] = [];
}
$transformed[$lowerKey][$key] = $value;
}
print_r($transformed);
산출:
Array
(
[userid] => Array
(
[UserID] => 123
[userid] => 456
)
)
이런 식으로 당신은 모든 원래의 주요 충돌 값을 동시에 유지하고 이후에 유연하게 처리 할 수 있습니다.
문제를 피하는 기본 방법은 프론트 엔드 또는 API 응답에서 소문자 또는 밑줄 스타일 키 이름을 사용하는 등 데이터를 수신하기 전에 키 이름을 정규화하는 것 입니다.
예를 들어, 인터페이스에서 반환 된 데이터 구조를 제어하면 서버 또는 프론트 엔드에서 통합 형식을 강제하도록 매개 변수를 설정할 수 있습니다.
$url = "https://m66.net/api/userinfo?userid=123";
// 인터페이스를 통해 표준화 된 키 이름 데이터를 반환합니다
Array_Change_key_case () 는 매우 실용적인 기능이지만, 케이스 변환이 사용할 때 키 이름 충돌이 발생할 수 있다는 문제에주의해야합니다. 수동으로 처리, 구조 스토리지 또는 표준 데이터 입력으로 데이터 손실을 피할 수 있습니다.
유사한 문제를 피하고 코드의 가독성과 안정성을 향상시키기 위해 대규모 프로젝트에서 데이터 구조 및 이름 지정 스타일을 통합하는 것이 좋습니다 .