현재 위치: > 최신 기사 목록> array_diff_ukey 및 array_map을 결합하는 방법 PHP에서 복잡한 배열 키 비교를 구현하는 방법

array_diff_ukey 및 array_map을 결합하는 방법 PHP에서 복잡한 배열 키 비교를 구현하는 방법

gitbox 2025-09-08

<span><span><span class="hljs-meta"><?php</span></span><span> </span><span><span class="hljs-comment">// 本文将探讨在 PHP 中如何结合 array_diff_ukey 和 array_map 来实现更复杂的数组键比较场景。</span></span><span> </span><span><span class="hljs-comment">// array_diff_ukey 提供了自定义键比较的能力,而 array_map 则可以帮助我们对数据进行预处理,</span></span><span> </span><span><span class="hljs-comment">// 两者结合能够解决一些仅靠单一函数无法处理的问题。</span></span><span> </span><span><span class="hljs-comment">// --------------------------------------------</span></span><span> 在 PHP 的数组操作中,常见的函数如 `array_diff`、`array_diff_assoc`、`array_diff_key` 都提供了 对数组值或键的差集比较功能。然而,当我们需要在 **键的比较逻辑上引入自定义规则** 时, `array_diff_ukey` 就显得非常有用。它允许开发者传入一个用户自定义的回调函数,来决定两个键 在比较时的先后关系。 例如,假设我们有两个数组: ```php </span><span><span class="hljs-variable">$array1</span></span><span> = [ </span><span><span class="hljs-string">"User_01"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"User_02"</span></span><span> => </span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-string">"User_03"</span></span><span> => </span><span><span class="hljs-string">"Charlie"</span></span><span> ]; </span><span><span class="hljs-variable">$array2</span></span><span> = [ </span><span><span class="hljs-string">"user_1"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"user_4"</span></span><span> => </span><span><span class="hljs-string">"David"</span></span><span> ]; </span></span>

기본적으로 Array_diff_ukey는 "user_01""user_1" 사이의 유사성을 인식하지 못합니다.
비즈니스 논리가 비교 해야하는 경우, 우리는 결합해야합니다.
전처리를위한 array_map .

키 정규화에 Array_Map을 사용하십시오

Array_MapArray_Keys를 사용하여 배열 키에서 "표준화"프로세스를 수행하고 통합 형식으로 변환 한 다음 비교할 수 있습니다.

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalizeKey</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key</span></span></span><span>) {
    </span><span><span class="hljs-comment">// 밑줄을 제거하고 소문자로 돌립니다</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">"_"</span></span><span>, </span><span><span class="hljs-string">""</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>));
}

</span><span><span class="hljs-variable">$normalized1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)
);

</span><span><span class="hljs-variable">$normalized2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)
);
</span></span>

현재 $ 정상화 된 1$ 정규화 된 2 의 키는 "밑줄이없는 소문자"로 균일하게 변환되었습니다.

복잡한 비교를 달성하기 위해 array_diff_ukey를 결합합니다

다음으로 Array_diff_ukey를 사용하여 비교할 수 있습니다.

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_ukey</span></span><span>(</span><span><span class="hljs-variable">$normalized1</span></span><span>, </span><span><span class="hljs-variable">$normalized2</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

출력 결과는 다음과 같습니다.

 <span><span>Array
(
    [</span><span><span class="hljs-meta">user02</span></span><span>] =&gt; Bob
    [</span><span><span class="hljs-meta">user03</span></span><span>] =&gt; Charlie
)
</span></span>

알 수 있듯이 사용자 _01user_1은 동일한 키로 인식되므로 차이 결과를 제외합니다.

요약

array_map 의 주요 표준화Array_diff_ukey 의 사용자 정의 키 비교를 결합하여
케이스 무시, 특정 문자 제거 및 부분 일치 구현과 같은보다 복잡한 키 매칭 로직을 처리 할 수 ​​있습니다.
이 접근법은 외부 데이터 소스 (예 : API 리턴 값, 사용자 업로드 데이터)를 처리 할 때 특히 유용합니다.이 데이터의 키는 항상 통합 형식이 아니기 때문입니다.

이 유연한 기능 조합 아이디어는 코드의 유지 관리 가능성을 향상시킬뿐만 아니라 변경 가능한 데이터 구조에 신속하게 적응할 수 있습니다.

 <span></span>