0

次のような多次元配列があります。

Array (
[0] => Array
    (
        [time] => 1364685993
        [memberid] => 131
    )

[1] => Array
    (
        [time] => 1364685994
        [memberid] => 133
    )
[2] => Array
    (
        [time] => 1364685995
        [memberid] => 141
    )
)

および次のような 1 次元配列:

Array (
  [0] => 131
  [1] => 141
  [2] => 191
  [3] => 205
)

通常の配列の memberid 値を含まない多次元配列からすべてのサブ配列を削除したいですか?

この場合、「memberid」キー値 (133) が通常の配列に表示されないため、Subaray[1] のみが多次元配列から削除されます。これらの配列は実際にはかなり大きいので、何が最速の方法なのかわかりません。

4

4 に答える 4

4
$normalArray = array_flip($normalArray);

$multiDimArray = array_filter($multiDimArray, function ($elem) use ($normalArray) {
    return isset($normalArray[$elem['memberid']]);
});

各配列に対して 1 回ずつ、正確に 2 回の反復が必要です。を使用したキー検索$normalArray[$elem['memberId']]は非常に高速です。機能的な性質と配列のコピーにより、メモリのオーバーヘッドが発生する可能性があります。従来のループを使用し、unsetそれが問題になる場合。

于 2013-03-31T21:39:34.670 に答える
3

まず、次のように配列を反転して、$nomal配列への検索時間を一定にします。

$normal = array_flip( $normal);

次に、単純なルックアップを使用し$multidimensional_arrayて配列でフィルター処理する必要があります。$normal

$filtered = array_filter( $multidimensional_array, function( $el) use( $normal) {
    return isset( $normal[ $el['member_id'] ]);
});
于 2013-03-31T21:39:23.817 に答える
1

現時点では、テストのために開発リソースにアクセスできませんが、これは機能するはずです。

foreach($members as $member => $property) {
    if (!in_array($property['member_id'], $id_array)) {
        unset($members[$member]);
    }
}

$id_arrayは、質問に入力した 1 次元の行列 (配列) です。

于 2013-03-31T21:38:50.503 に答える
0

事後にデータベース結果をフィルタリングする代わりに、データベース クエリ自体で 1 次元配列を使用することができます。

あなたが使用しているクエリがどのように見えるかはわかりませんが、これらの行に沿った何かがそれを行うでしょう:

// The ids from the file
$use_ids = array(131, 141, 191, 205);

// Create a list for the IN clause
$ids = '(' . implode(',', $use_ids) . ')';

// Create the query
$query = <<< SQL
    SELECT time, memberid
    FROM some_table
    WHERE ...
        AND memberid IN {$ids}
    ORDER BY time
SQL;

// Execute the query, etc.

可能な限り多くのコンテンツのフィルタリングを SQL に処理させることは、常に良い考えです。

于 2013-03-31T21:57:32.123 に答える