キーの配列を使用して、「順序」を維持しながら別の配列をフィルタリングします

DJules

私は、ループなどを含む、標準の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を使用して簡単ですが、より速く実行できると確信しています。見えない。

ArtisticPhoenix

ものすごく単純

$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行にします)。それを使って関数を作るときに、たまたま思いついたことがあります。

Sanbox

楽しい!

更新

アイデアをくれた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]

編集
0

コメントを追加

0

関連記事

分類Dev

Swift配列:別の配列を使用して配列をフィルタリングしている間、順序を維持します

分類Dev

ファイルの内容を配列に入れ、順序を維持しながらデータを更新します

分類Dev

単語の列の順序を維持しながら、単語の文字列の配列を分割します

分類Dev

配列を組み合わせて順序を維持しますが、ある配列の順序を別の配列よりも優先します

分類Dev

キーのルックアップを維持しながら、Javascriptオブジェクト/配列の順序を維持する方法は?

分類Dev

JavaScriptを使用して、配列から別の配列に異なる順序で値をプルします

分類Dev

pandas groupbyを使用しますが、他の列の順序を維持してから、グループ内でシフトします

分類Dev

Swift 3設定と順序の維持を使用して、別の配列に存在するオブジェクトを配列から削除します

分類Dev

順序を維持しながら、別の配列に基づいて配列内の一意の値を保持する

分類Dev

最初のインスタンスと順序を維持しながら、2Dnumpy配列の繰り返し行を削除します

分類Dev

配列の順序を維持しますが、値を変更します

分類Dev

配列を並べ替えて一致する要素をグループ化しますが、元の順序を維持します

分類Dev

AngularJs配列を別の配列でフィルタリングします

分類Dev

別の配列の特定の値を使用して複数の配列をフィルタリングする

分類Dev

JS:配列で指定された順序を維持しながら、2つの異なるプロパティでJSON配列を並べ替えます

分類Dev

php列の順序を維持しながら、多次元配列をシャッフルします

分類Dev

ラベルの別の配列を使用して numpy 配列をフィルタリングする

分類Dev

Swiftの別の配列の要素を使用して配列をフィルタリングする方法は?

分類Dev

別の配列の要素を使用して配列内の要素をフィルタリングする

分類Dev

awkを使用してbashで別の順序付けられた配列パターンを使用して、複数行の配列を並べ替えます

分類Dev

キーで配列をフィルタリングし、JavaScriptを使用して値を別の配列にプッシュする方法

分類Dev

キーで配列をフィルタリングし、JavaScriptを使用して値を別の配列にプッシュする方法

分類Dev

TLA +で順序を維持しながらタプルをフィルタリングする

分類Dev

内部に1つの配列がある配列からデータをフィルタリングします

分類Dev

javascriptを使用して配列からのキーに基づいてフィルタリングする方法は?

分類Dev

別の配列の値を使用して配列をフィルタリングする

分類Dev

別のNumPy配列の値を使用してNumPy配列をフィルタリングする方法

分類Dev

linqjsを使用して、別の配列の値を使用して1つの配列をフィルタリングします

分類Dev

配列をフィルタリングして、別の配列の合計を求めます

Related 関連記事

  1. 1

    Swift配列:別の配列を使用して配列をフィルタリングしている間、順序を維持します

  2. 2

    ファイルの内容を配列に入れ、順序を維持しながらデータを更新します

  3. 3

    単語の列の順序を維持しながら、単語の文字列の配列を分割します

  4. 4

    配列を組み合わせて順序を維持しますが、ある配列の順序を別の配列よりも優先します

  5. 5

    キーのルックアップを維持しながら、Javascriptオブジェクト/配列の順序を維持する方法は?

  6. 6

    JavaScriptを使用して、配列から別の配列に異なる順序で値をプルします

  7. 7

    pandas groupbyを使用しますが、他の列の順序を維持してから、グループ内でシフトします

  8. 8

    Swift 3設定と順序の維持を使用して、別の配列に存在するオブジェクトを配列から削除します

  9. 9

    順序を維持しながら、別の配列に基づいて配列内の一意の値を保持する

  10. 10

    最初のインスタンスと順序を維持しながら、2Dnumpy配列の繰り返し行を削除します

  11. 11

    配列の順序を維持しますが、値を変更します

  12. 12

    配列を並べ替えて一致する要素をグループ化しますが、元の順序を維持します

  13. 13

    AngularJs配列を別の配列でフィルタリングします

  14. 14

    別の配列の特定の値を使用して複数の配列をフィルタリングする

  15. 15

    JS:配列で指定された順序を維持しながら、2つの異なるプロパティでJSON配列を並べ替えます

  16. 16

    php列の順序を維持しながら、多次元配列をシャッフルします

  17. 17

    ラベルの別の配列を使用して numpy 配列をフィルタリングする

  18. 18

    Swiftの別の配列の要素を使用して配列をフィルタリングする方法は?

  19. 19

    別の配列の要素を使用して配列内の要素をフィルタリングする

  20. 20

    awkを使用してbashで別の順序付けられた配列パターンを使用して、複数行の配列を並べ替えます

  21. 21

    キーで配列をフィルタリングし、JavaScriptを使用して値を別の配列にプッシュする方法

  22. 22

    キーで配列をフィルタリングし、JavaScriptを使用して値を別の配列にプッシュする方法

  23. 23

    TLA +で順序を維持しながらタプルをフィルタリングする

  24. 24

    内部に1つの配列がある配列からデータをフィルタリングします

  25. 25

    javascriptを使用して配列からのキーに基づいてフィルタリングする方法は?

  26. 26

    別の配列の値を使用して配列をフィルタリングする

  27. 27

    別のNumPy配列の値を使用してNumPy配列をフィルタリングする方法

  28. 28

    linqjsを使用して、別の配列の値を使用して1つの配列をフィルタリングします

  29. 29

    配列をフィルタリングして、別の配列の合計を求めます

ホットタグ

アーカイブ