2011-05-19 13 views
3

私はレコードが重複しているので一意にソートする必要がある多次元配列を持っていますので、配列を通過して重複を値で削除する必要があります(例:array_unique)。値に基づいてユニークな多次元配列

Array 
(
    [0] => Array 
     (
      [id] => 324 
      [time_start] => 1301612580 
      [level] => 0.002 
      [input_level] => 0.002 
     ) 

    [1] => Array 
     (
      [id] => 325 
      [time_start] => 1301612580 
      [level] => 0.002 
      [input_level] => 0.002 
     ) 

    [2] => Array 
     (
      [id] => 326 
      [time_start] => 1301612580 
      [level] => 0.002 
      [input_level] => 0.002 
     ) 
) 

あり、彼らはすべて同じであるtime_start、またlevelinput_levelを重複しているが、彼らはtime_startはそれを削除し、全体配列(配列を処理しなければならないが、一致している場合にのみ、影響を受けないようにしていますあなたが思っているよりも大きいですが、私はちょうど配列の小さな例を投稿しました)。 dupesを削除し、次のように返す必要があります:私は働かなかったことがわかりました

Array 
(
    [0] => Array 
     (
      [id] => 324 
      [time_start] => 1301612580 
      [level] => 0.002 
      [input_level] => 0.002 
     ) 
) 

質問:

答えて

8
$input = array(/* your data */); 
$temp = array(); 
$keys = array(); 

foreach ($input as $key => $data) { 
    unset($data['id']); 
    if (!in_array($data, $temp)) { 
     $temp[]  = $data; 
     $keys[$key] = true; 
    } 
} 

$output = array_intersect_key($input, $keys); 

または

$input = array(/* your data */); 
$temp = $input; 

foreach ($temp as &$data) { 
    unset($data['id']); 
} 

$output = array_intersect_key($input, array_unique($temp)); 
+0

あなたのキーは個々の連想フィールド名ではなく配列インデックスであることになります。 –

+0

私の編集を見てください。 – hsz

+0

私は、opは、 'id以外のすべてのもの'ではなく、単一のフィールドについてのみ気にすると思います。また、ここに分散をキャストしない...しかし、array_uniqueはそのように動作しますか?私はそれが基本的に厳密な等価を内部的に使用していると考えました。これは、この性質の配列を比較するための使用を排除します。 –

1

私はあなたがそれを歩かなければならないと思う:

$usedVals = array(); 
$outArray = array(); 
foreach ($targetArray as $arrayItem) 
{ 
    if (!in_array($arrayItem['time_start'],$usedVals)) 
    { 
     $outArray[] = $arrayItem; 
     $usedVals[] = $arrayItem['time_start']; 
    } 
} 
return $outArray; 
+0

スローバリアント – Danzan

+0

@ダルザンとは対照的に、配列を列挙するには? :)それは、上記の提案よりも多くの記憶を食べるだろうが、それは本当にはるかに遅くすべきではない。さらに、そこにはいくつかの論理的な欠陥があり、私が取り組んでいたところです。 –

0
$uniq = array(); 
foreach($no_unique as $k=>$v) if(!isset($uniq[$v['time_start']])) $uniq[$v['time_start']] = $v; 
$uniq = array_values($uniq); 
5
$temp = array(); 
array_filter($yourArray, function ($v) use (&$temp) { 
    if (in_array($v['time_start'], $temp)) { 
     return false; 
    } else { 
     array_push($temp, $v['time_start']); 
     return true; 
    } 
}); 

は、コールバックの結果に基づいて、配列をフィルタリングなるarray_filter()を使用します(私ができる匿名関数を使用PHP 5.3以来使用されています)。 time_startの値は、一時的な配列に集められます。

+1

優れたソリューション* THUMBS_UP *! – userlond

+0

謝るべきこと。 * array_filter *はフィルタリングされた配列を返し、(場所によって)場所を変更しません。詳細情報[ここ](http://php.net/manual/en/function.array-filter.php) – userlond