2010-11-25 1 views
0

私は100のサブ配列を持つ多次元配列を持っているとします。サブ配列には常に少なくとも3つのインデックスがありますが、それ以上のインデックスを持つことができます。私は大きい配列から他のものの複製であるすべてのサブ配列を削除したいと思いますこれらの3つのインデックスに関して。 2つだけのサブアレイを有するアレイを有する実施例:第3インデックスが4でない場合でも一致するためのサブアレイいくつかの特定のインデックスに関してPHP配列の重複を削除する

array(array(0 => 'a', 1=> 'b', 2 => 'c', 3 => 'd'), array(0 => 'a', 1=> 'b', 2=> 'c', 3=> 'z')) 

一つは、除去されます。

私は、最もエレガントで効率的なソリューションを探しています。

+0

この2つを削除する場合はどちらを選択しますか? –

+0

は関係ありません。 – babonk

答えて

1
/** 
* Create Unique Arrays using an md5 hash 
* 
* @param array $array 
* @return array 
*/ 
function arrayUnique($array, $preserveKeys = false) 
{ 
    $arrayRewrite = array(); 
    $arrayHashes = array(); 
    foreach($array as $key => $item) { 
     $hash = md5(serialize($item)); 
     if (!isset($arrayHashes[$hash])) { 
      $arrayHashes[$hash] = $hash; 
      if ($preserveKeys) { 
       $arrayRewrite[$key] = $item; 
      } else { 
       $arrayRewrite[] = $item; 
      } 
     } 
    } 
    return $arrayRewrite; 
} 

$uniqueArray = arrayUnique($array); 
var_dump($uniqueArray); 

FROM:http://www.phpdevblog.net/2009/01/using-array-unique-with-multidimensional-arrays.html

人々にサイトを訪問するインセンティブを与えるために、コメントを削除しました - 私はいくつかの機会に、これを使用しました。

希望に役立ちます!

EDIT:最初の3つのインデックスを照合する必要があるという点でこの特定の問題の解決策ではありませんが、多次元配列でarray_unique()を使用するにはどのようにすればよいですか?

誰かがあなたの目的に沿ってポップアップして編集することができれば、すべてが優れています!

+0

K、それを改変してください。なぜPHPはarray_unique_custom(compare_callback、array)のような関数を持っていませんか?別のインデックスが比較されるコールバックを提供することができますか? – babonk

+0

この例題はいくつかの点で改善することができますが、大きな間違いもあります: 'md5'呼び出しのために、両方の型と値の可能なすべての順列を事前に知っていない限り、この関数が正しく動作することは保証できませんサブアレイ内のキーとアイテムを表示します。 – Jon

1

Zenphは90%の権利を得ていますが、最初の3つの要素を一意に見たいだけでした。シリアル化の直前にZenphのコードと組み合わせて以下の関数を使用して、最初の3つの要素のみを見ることができます。

function firstThree($array) 
{ 
    $retArray = array(); 
    array_push($retArray, $array[1], $array[2], $array[3]); 
    return $retArray; 
} 
0

これはトリックを行います。静的変数を持つフリー関数のために最もエレガントな例ではありませんが、ラムダまたはクラスのインスタンスをコールバックターゲットに使用すると、より洗練されたものにすることができます。

function filter($subArray) { 
    static $seenKeys = null; 
    if ($seenKeys === null) { 
     $seekKeys = array(); 
    } 

    // I 'm just selecting the "three first" indexes here, 
    // you can change it to better suit your needs 
    $thisKey = serialize(array_slice($subArray, 0, 3)); 
    if (isset($seenKeys[$thisKey])) { 
     return false; 
    } 
    else { 
     return $seenKeys[$thisKey] = true; 
    } 
} 

$result = array_filter($inputArray, 'filter'); 

私は、この例では、あなたがタイプおよび/または各サブアレイの最初の3つの項目の値についての仮定をせずにPHPに行くことができるほど高速だと思います。そのような仮定ができれば、少なくともserializeコールはより適切なものに置き換えることができます。私はこれがプロセスをかなりスピードアップすると思います。

関連する問題