0

値[id]のみをチェックして重複を確認し、この「フィールド」[id]が重複しているすべてのキーを削除したいと思います。

例:番号が1、2、1の場合。結果を1、2ではなく2にします。また、重複の基準は、[id]をチェックすることによってのみ決定され、他の「フィールド」は決定されません。

元の配列:

Array
(
    [0] => Array
        (
            [name] => John
            [id] => 123
            [color] => red
        )

    [1] => Array
        (
            [name] => Paul
            [id] => 958
            [color] => red
        )

    [2] => Array
        (
            [name] => Jennifer
            [id] => 123
            [color] => yellow
        )
)

私が望む結果:

Array
(
    [0] => Array
        (
            [name] => Paul
            [id] => 958
            [color] => red
        )

)
4

4 に答える 4

2

私は上記のすべての人に同意します。あなたが試したことについてもっと情報を提供する必要がありますが、私はゴルフをコーディングするのが好きなので、これが完全に読めない解決策です。

$new_array = array_filter($array, function($item) use (&$array){
    return count(array_filter($array, function($node) use (&$item){
        return $node['id'] == $item['id'];
    })) < 2;
});
于 2012-10-19T20:20:54.050 に答える
1

これは、いくつかの単純なループでかなり簡単に実行できるはずです。

set_time_limit(0); // Disable time limit to allow enough time to process a large dataset

// $items contains your data

$id_counts = array();
foreach ($items as $item) {
    if (array_key_exists($item['id'], $id_counts)) {
        $id_counts[$item['id']]++;
    } else {
        $id_counts[$item['id']] = 1;
    }
}

for ($i = count($items); $i >= 0; $i--) {
    if ($id_counts[$items[$i]['id']] > 1) {
        array_splice($items, $i, 1);
    }
}

結果:

Array
(
    [0] => Array
        (
            [name] => Paul
            [id] => 958
            [color] => red
        )
)

それを行うためのより良い方法がありますが、この方法の1つの利点は、IDと重複IDのリストに対して新しい配列を作成するだけでありarray_splice、元の配列から重複を削除するため、メモリ使用量が最小限に抑えられることです。

編集:時々それが置き去りにされることを意味するバグを修正しました

于 2012-10-19T20:17:54.310 に答える
0

これは答えに対する非常に基本的なアプローチであり、はるかに良い答えがあると確信していますが、おそらく紙の場合と同じようにそれを行うことから始めます。

最初のインデックスを見て、その値を確認します。次に、値が最初に記録した値と同じである場合は、それらのインデックスを記録して、他のすべてのインデックスを調べます。その特定の値を持つインデックスが複数ある場合は、リストを確認したら、それらをすべて削除します(削除中に他のインデックスに影響を与えないように、最も高いインデックスから開始します)。

リストの最後に到達するまで、他のすべてのインデックスに対してこれを実行します。

それは長い間巻き込まれていますが、重複しているすべての値を確実に削除します。元々重複がなかったものだけを残します。

于 2012-10-19T20:18:48.277 に答える
0
function PickUniques(array $items){
    // Quick way out
    if(empty($items)) return array();
    $counters = array();
    // Count occurences
    foreach($items as $item){
        $item['id'] = intval($item['id']);
        if(!isset($counters[$item['id']])){
            $counters[$item['id']] = 0;
        }
        $counters[$item['id']]++;
    }
    // Pop multiples occurence ones
    foreach($counters as $id => $occurences){
        if($occurences > 1){
            unset($counters[$id]);
        }
    }
    // Keep only those that occur once (in $counters)
    $valids = array();
    foreach($items as $item){
        if(!isset($items[$item['id']])) continue;
        $valids[$item['id']] = $item;
    }
    return $valids;
}

これを試してください:)

于 2012-10-19T20:14:37.793 に答える