현재 위치: > 최신 기사 목록> array_change_key_case ()의 오용으로 인해 키 이름 데이터가 손실됩니다

array_change_key_case ()의 오용으로 인해 키 이름 데이터가 손실됩니다

M66 2025-04-28

PHP 개발에서 Array_change_key_case ()는 배열의 모든 키 이름을 대문자 또는 소문자로 변환 할 수있는 매우 편리한 기능입니다. 그러나 당신은 알고 있습니까?

특정 예를 들어이 문제가 어떻게 발생하는지 살펴 보겠습니다.

1. 기능 소개

 array_change_key_case(array $array, int $case = CASE_LOWER): array
  • $ 배열 : 입력 배열.

  • $ CASE : 선택적 매개 변수, 기본값은 Case_Lower (소문자) 또는 Case_Upper (대문자)로 설정할 수 있습니다.

2. 위험한 예 : 키 이름 케이스 충돌은 데이터 손실을 유발합니다.

 $data = [
    'Name' => 'Alice',
    'name' => 'Bob',
    'Age'  => 25,
];

$result = array_change_key_case($data, CASE_LOWER);

print_r($result);

출력 결과 :

 Array
(
    [name] => Bob
    [age] => 25
)

당신은 그것을 보셨습니까? '이름'=> 'Alice' 가 사라졌습니다!
이는 '이름''이름' 이 소문자로 변환 된 후 '이름' 이되어 '앨리스'가 '밥' 에 의해 덮어 쓰여 있기 때문입니다!

3. 왜 이런 일이 일어나고 있습니까?

Array_change_key_case ()는 "케이스가 다르지만 실제로는 동일한"키 이름이 있는지 여부를 감지하지 못하며, 키 이름을 상류 및 소문자로 간단히 대체합니다 . 충돌이 발생하면 뒤에서 키가 전면 키를 덮어 쓰고 경고 나 오류도받지 못합니다.

여러 소스에서 데이터를 처리 할 때 특히 위험합니다. 예를 들어, 양식 병합 또는 API 병합을 수행 할 때 키 이름 간의 사례 충돌을 인식하지 못하면 데이터가 무의식적으로 손실됩니다.

4.이 구덩이를 피하는 방법?

? 방법 1 : 충돌을 수동으로 확인합니다

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);
}

? 방법 2 : 병합 전에 소스 데이터를 표준화합니다

API를 통해 가져온 컨텐츠와 같은 외부 데이터를 처리하는 경우 병합 전에 데이터를 표준화하거나 키 이름 규칙을 지정할 수 있습니다.

 $apiData = json_decode(file_get_contents('https://m66.net/api/user'), true);

// 소스가 신뢰할 수 있다고 가정합니다,통일 된 소문자로 사용하십시오
$safeData = array_change_key_case($apiData, CASE_LOWER);

5. 요약

Array_change_key_case () 는 간단하고 실용적인 기능이지만 잠재적 파괴성을 무시할 수는 없습니다. 처리중인 데이터에 키 이름이 복제 될 수있는 경우, 수행하기 전에 두 번 생각하십시오!

?? 팁 :

  • 기본 동작은 충돌을 유발하지 않습니다!

  • "조용히"데이터를 덮어 쓸 수 있습니다!

  • 데이터 통합 ​​시나리오가 많을수록 사용해야합니다.