私は、ループなどを含む、標準のPHPコーディングを使用して以下を作成しました。ただし、すべてのPHP配列関数(array_intersect *、array_fill *、およびco ...)の組み合わせを使用して、同じアルゴリズムを実行できると確信しています。
私は誰かがすでにこれに遭遇し、方法、速い方法を見つけたことを望んでいます。
わかりました、ここにあります:
インデックス付きの配列があります。これをデータと呼びましょう。エンティティに関する情報がたくさん含まれています。結局のところ、インデックス付きの配列であるため、順序は明らかに重要ではありません。
$data = [
'title' => 'loops and things',
'id' => '28fr2',
'link' => 'https://blah',
'itemid' => '28fr3',
'quantity' => 3,
//...
];
これで、データ配列のサブセットを記述する他の配列のセットができました。たとえば、次のようになります。
$product = [
'id',
'title',
'link'
];
そして
$inventory = [
'itemid',
'quantity',
];
私が求めているのは次のようなものです。
array_intersect_key_while_we_keep_the_order($data, $product);
与えるだろう
[
'id' => '28fr2',
'title' => 'loops and things',
'link' => 'https://blah'
]
そして
array_intersect_key_while_we_keep_the_order($data, $inventory);
与えるだろう
[
'itemid' => '28fr2',
'quantity' => 3
]
array_intersect_keyで私が抱えている問題は、「順序」がキーのリストを定義するものではなく、ソース配列からのものであるということです。これは明らかにforeachesを使用して簡単ですが、より速く実行できると確信しています。見えない。
ものすごく単純
$data = [
'title' => 'loops and things',
'id' => '28fr2',
'link' => 'https://blah',
'itemid' => '28fr3',
'quantity' => 3,
//...
];
$product = [
'id',
'title',
'link'
];
$res = array_merge(array_fill_keys($product, null),array_intersect_key($data, array_flip($product)));
print_r($res);
出力
Array
(
[id] => 28fr2
[title] => loops and things
[link] => https://blah
)
仕組み、ここでの主なトリックは、配列の塗りつぶしキーと配列のマージです。これらを使用することで、「テンプレート」配列を作成できます。同じキーを持つ2つの配列をマージすると、最初の配列の順序でマージされるためです。したがって、最初の配列をの順序に設定し、$product
それにマージすると、「偽の」値が実際の値に置き換えられ、順序が保持されます。
必要に応じて、配列フリップ(または配列フィルキー)の結果を使用することもできますが、2行のコードになります... :)
そしてもちろん、配列フリップキーや配列塗りつぶしキーなどを使用して、の値$product
を配列交差キーに使用できるキーに変更する必要があります。
私は多様性のために配列フィルキーと配列フリップの両方を使用しましたが、この状況ではそれらは多少互換性があります。たとえば、これはもう少し効率的です。
$map = array_fill_keys($product, null);
$res = array_merge($map,array_intersect_key($data, $map));
print_r($res);
しかし、2行かかります...配列反転よりも配列塗りつぶしキーの方が好ましいことを述べておきます。配列の交差キーはマップにないものをすべて除外するため、実際には問題ではありません。ただし、マップ配列の値は同じであるため、「一般的に」優れていますが、フリップを使用する場合は数値キーであるため、状況によっては操作が少し難しくなる可能性があります(ただし、これはそうではありません)。
私はほとんどあなたがこのようにそれを機能させることができるようになりました
function ordered_array_intersect_key(array $data, array $map){
return array_merge(($map = array_fill_keys($map, null)),array_intersect_key($data, $map));
}
私はarray_merge
それをわかりやすい名前にする自由を取りました。インラインで割り当てを使用することで、ケーキを持って食べることもできます(array_fill_keysを再利用して1行にします)。それを使って関数を作るときに、たまたま思いついたことがあります。
楽しい!
更新
アイデアをくれたmosh442に感謝します。次のarray_walk
ような新しいアレイを構築するために使用することもできます。
$data = [
'title' => 'loops and things',
'id' => '28fr2',
'link' => 'https://blah',
'itemid' => '28fr3',
'quantity' => 3,
//...
];
$product = [
'id',
'title',
'link'
];
$new = [];
array_walk($product, function($v,$k,$data) use (&$new){$new[$v] = $data[$v];},$data);
print_r($new);
出力
Array
(
[id] => 28fr2
[title] => loops and things
[link] => https://blah
)
私はこのような質問が大好きで、とても楽しいです...。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加