0

私が使用しているプログラミング言語:PHP

データベースから30件の結果があります。これはARRAYまたはOBJECTSです。

私が欲しいのは、COMMON値を見つけるアルゴリズムです。

元 :

$data[0] = array('effected_object_id'=>54,'data'=>array('some_data'));
$data[1] = array('effected_object_id'=>21,'data'=>array('some_data'));
$data[2] = array('effected_object_id'=>63,'data'=>array('some_data'));
$data[3] = array('effected_object_id'=>21,'data'=>array('some_data'));
$data[4] = array('effected_object_id'=>54,'data'=>array('some_data'));
$data[5] = array('effected_object_id'=>21,'data'=>array('some_data'));
...... 30 arrays

上記の例では、effect_object_id列に、21(3)、54(2)などの一般的な要素がいくつかあります。

これらの共通の要素を取得したいと思います。

これがすでにどこかで質問され解決されている場合は申し訳ありませんが、私はグーグルで頭を試してみました。しかし、高速な解決策を見つけることができません。はい、ここではあまり多くのループは必要ありません。

前もって感謝します。:)

4

2 に答える 2

2
$groups = array();
foreach ($data as $row) {
    $groups[ $row['effected_object_id'] ][] = $row;
}
于 2012-05-21T19:52:29.593 に答える
2

最も簡単な方法は、配列をハッシュテーブルとして使用することです。

基本的に、次の形式の配列を作成できます。

array[k] = v

ここで、kはeffected_object_idであり、vはeffective_object_id=kを持つエントリの配列です。

好き:

$vals = array(
    21 => array('data1', 'data2'),
);

好き:

$indexedData = array();
foreach ($data as $d) {
    $indexedData[$d['effected_object_id']][] = $d['data'];
}

そして、繰り返される値を見つけるために、ループしてcount()>1をチェックすることができます。

正確なニーズに応じて、このアプローチを別の方法で構成することもできますが、これが基本的な考え方を伝えることを願っています。

重複を見つけるために、これはO(n)であることに注意してください。重複を見つけるには、実際には2n回未満の反復が必要です。 nエントリにインデックスを付けるには反復が必要です。次に、インデックス付き配列をループして重複を探すために、n未満の反復が必要です。

于 2012-05-21T19:52:49.793 に答える