PHPでは、 array_flip()は非常に実用的な機能です。その機能は、配列内のキーと値を交換することです。
array_flip(array $array): array
新しい配列を返し、元の配列の値をキーとして、元のキーを値として取得します。ただし、配列内の値がリソースタイプ**である場合、状況はやや微妙になります。
PHPでは、リソースは、データベース接続、オープンファイルハンドル、画像リソースなど、外部リソースへの参照を表すために使用される特別な変数です。
$fp = fopen('http://m66.net/sample.txt', 'r');
var_dump($fp);
// 出力は似ています:resource(3) of type (stream)
これは、文字列、整数、フローティングポイント番号、または配列ではなく、PHPで内部で使用される参照タイプであり、文字列または数字が必要なほとんどのコンテキストでは直接使用できません。
リソースタイプの値を含む配列でarray_flip()を使用しようとすると、PHPはこれらの値を新しい配列のキーとして文字列に変換しようとします。ただし、リソースタイプを明示的かつ一貫した方法で文字列に変換することはできません。これはいくつかの問題を引き起こす可能性があります。
実用的な例を見てみましょう。
$fp1 = fopen('http://m66.net/file1.txt', 'r');
$fp2 = fopen('http://m66.net/file2.txt', 'r');
$arr = [
'file1' => $fp1,
'file2' => $fp2,
];
$flipped = array_flip($arr);
print_r($flipped);
キーを使用した配列をリソースとして、元のキーとして値として出力することが期待される場合があります。しかし、実際には、 array_flip()は、キーとして「リソースID#3」などの文字列の形式でリソースIDをリソースIDに変換します。
Array
(
[Resource id #3] => file1
[Resource id #4] => file2
)
リソースIDは動的に割り当てられ、異なるリクエスト、異なるマシン、異なるランタイムから異なるIDが取得される場合があります。これは、フリップされた配列が一貫性を保証することができず、キャッシュやハッシュ比較などの決定論的キーを必要とする操作には使用できないことを意味します。
複数のリソースを使用しますが、文字列変換後に一部のリソースが一貫している場合(まれですが)、重要な競合が発生する可能性があります。Array_flip ()は最後の値のみを保持し、残りは上書きされます。
Array_flip()は理論的に可逆的です(つまり、 Array_flip()はフリップされた配列の元の状態を復元します)が、リソースの文字列表現は削減できないため、このプロセスは元のリソース変数に復元できません。
配列をフリップする必要がある場合は、値が文字列または整数タイプであることを確認してください。リソースを含む配列の場合、 array_flip()を直接使用しないでください。実行可能な代替品は、マッピングテーブルを自分で構築することです。