[PHP에서 array_flip 함수를 사용할 때 키 가치 충돌을 피하는 방법은 무엇입니까? 】
PHP에서 array_flip 함수는 키와 값을 배열의 값을 교환하는 매우 유용한 도구입니다. 간단히 말해서, array_flip은 배열의 키를 새 값과 새 키로 값으로 사용하고 새 배열을 반환합니다. 예를 들어:
<span><span><span class="hljs-variable">$arr</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$flipped</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_flip</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$flipped</span></span><span>);
</span></span>출력은 다음과 같습니다.
<span><span>Array
(
[</span><span><span class="hljs-meta">1</span></span><span>] => a
[</span><span><span class="hljs-meta">2</span></span><span>] => b
[</span><span><span class="hljs-meta">3</span></span><span>] => c
)
</span></span>그러나 array_flip 함수를 사용하면 키 가치 충돌이 발생할 수 있습니다. PHP의 배열 키가 독특하기 때문입니다. 원래 배열에 중복 값이있는 경우 역전 후 주요 값 충돌이 발생합니다. 기본적으로 Array_flip은 중복 값을 덮어 쓰고 일부 데이터 손실이 발생합니다.
다음 예를 고려하십시오.
<span><span><span class="hljs-variable">$arr</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-variable">$flipped</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_flip</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$flipped</span></span><span>);
</span></span>출력 결과는 다음과 같습니다.
<span><span>Array
(
[</span><span><span class="hljs-meta">1</span></span><span>] => a
[</span><span><span class="hljs-meta">2</span></span><span>] => c
)
</span></span>이 예에서는 원래 배열에 값이 2 인 두 개의 요소가 있습니다 ( 'b'=> 2 및 'c'=> 2 ). array_flip을 호출 한 후 값 2는 C 로 덮어 쓰여서 'b'=> 2가 손실됩니다.
이 문제를 해결하기 위해 배열을 반전시키기 전에 일부 처리를 수행하여 데이터가 손실되지 않도록 할 수 있습니다. 일반적으로 사용되는 몇 가지 방법은 다음과 같습니다.
일반적인 관행은 충돌하는 키 값을 배열 또는 문자열로 결합하여 각 새로운 키가 고유 해지는 것입니다. 예를 들어, 원래 배열의 값이 동일하면 원래 본드를 새로운 키로 배열로 결합 할 수 있습니다.
<span><span><span class="hljs-variable">$arr</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-variable">$newArray</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$arr</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>])) {
</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>] = </span><span><span class="hljs-variable">$key</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 핵심 가치가 충돌하는 경우,오래된 키와 새 키를 배열로 병합하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_array</span></span><span>(</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>])) {
</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>][] = </span><span><span class="hljs-variable">$key</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>] = [</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>], </span><span><span class="hljs-variable">$key</span></span><span>];
}
}
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$newArray</span></span><span>);
</span></span>산출:
<span><span>Array
(
[</span><span><span class="hljs-meta">1</span></span><span>] => a
[</span><span><span class="hljs-meta">2</span></span><span>] => Array
(
[</span><span><span class="hljs-meta">0</span></span><span>] => b
[</span><span><span class="hljs-meta">1</span></span><span>] => c
)
)
</span></span>이 예에서는 각 중복 값이 손실되지 않도록 배열을 통한 키 값 충돌을 처리하지만 대신 중복 키를 결합합니다.
중복 키를 병합하지 않고 원래 배열에 각 값이 몇 번 나타나는지 알고 싶다면 Array_Count_Values 함수를 사용할 수 있습니다. 이 방법을 통해 반전 된 키 값을 처리하여 충돌을 피할 수 있습니다.
<span><span><span class="hljs-variable">$arr</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-variable">$flipped</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_flip</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>);
</span><span><span class="hljs-variable">$countedValues</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_count_values</span></span><span>(</span><span><span class="hljs-variable">$arr</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$flipped</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$countedValues</span></span><span>[</span><span><span class="hljs-variable">$value</span></span><span>] > </span><span><span class="hljs-number">1</span></span><span>) {
</span><span><span class="hljs-variable">$flipped</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>] = </span><span><span class="hljs-variable">$value</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-comment">// 키 및 원본 키를 병합하십시오</span></span><span>
}
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$flipped</span></span><span>);
</span></span>산출:
<span><span>Array
(
[</span><span><span class="hljs-meta">1</span></span><span>] => a
[</span><span><span class="hljs-meta">2</span></span><span>] => c_2
)
</span></span>이 메소드는 원래 키 (예 : 원래 키)가 충돌 할 때 각 키에 고유 식별자를 추가하여 데이터가 손실되지 않도록합니다.
또 다른 방법은 중복 값을 JSON 문자열로 변환하여 각 값이 고유 해지는 것입니다.
<span><span><span class="hljs-variable">$arr</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-variable">$newArray</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$arr</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-title function_ invoke__">json_encode</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>)] = </span><span><span class="hljs-variable">$key</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$newArray</span></span><span>);
</span></span>산출:
<span><span><span class="hljs-title class_">Array</span></span><span>
(
[</span><span><span class="hljs-string">"1"</span></span><span>] => a
[</span><span><span class="hljs-string">"2"</span></span><span>] => c
)
</span></span>이 접근법은 원래 값을 반복 불가능하고 고유 한 데이터 구조로 변환해야 할 때 적합합니다.
array_flip 함수를 사용할 때 키 값 충돌을 피하는 것이 일반적인 과제입니다. 배열 값이 반복 될 수있는 경우 데이터가 손실되지 않도록하는 전략이 있습니다. 일반적인 방법에는 중복 키를 배열로 병합하거나 값을 계산하여 처리하거나 JSON이 고유 한 각 키를 코딩하는 것이 포함됩니다. 올바른 전략을 선택하는 것은 특정 요구 사항과 데이터 처리 시나리오에 따라 다릅니다.
관련 태그:
array_flip