[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の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