2017-04-27 12 views
0

私は多次元配列を持っています。リターン配列に重複が含まれています

$wd = array_unique($arr); 
$d = array_diff($arr, $wd); 
print_r($d); 

しかし、それは唯一の1次元配列と出力すべての重複のために働く:私が得た最も近いでした。これをどうやってやるの?所望の出力の

例:

配列の場合:

array(
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
    [2] => ( 
     [u] => test2u 
     [d] => test2d 
    ) 
    [3] => ( 
     [3] => test3u 
     [3] => test3d 
    ) 
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
) 

array([1] => ([u] => test1u [d] => test1d))

を返す必要があり、アレイがある場合:

array(
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
    [2] => ( 
     [u] => test2u 
     [d] => test2d 
    ) 
    [3] => ( 
     [3] => test3u 
     [3] => test3d 
    ) 
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
    [2] => ( 
     [u] => test2u 
     [d] => test2d 
    ) 
) 

が返すべきarray([1] => ([u] => test1u [d] => test1d)[2] => ([u] => test2u [d] => test2d))

が、配列の場合:

array(
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
    [2] => ( 
     [u] => test2u 
     [d] => test2d 
    ) 
    [3] => ( 
     [3] => test3u 
     [3] => test3d 
    ) 
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
    [2] => ( 
     [u] => test2u 
     [d] => test2d 
    ) 
    [1] => ( 
     [u] => test1u 
     [d] => test1d 
    ) 
) 

それだけ返す必要がありますarray([1] => ([u] => test1u [d] => test1d))

EDIT:配列は$arr = json_decode($arr);から来て、オリジナルのJSONが重複していたので

は、配列内のエントリが重複していますエントリ。 jsonをデコードせずにこれを行うより良い方法がある場合は、教えてください。

これは検索プログラムの一部として使用されています。 JSONは、検索用語の1つの条件を満たすソース配列のすべてのエントリの配列です。最も重複しているエントリを維持することは、それらのエントリがすべての検索用語ではないにしてもその大部分を含むことを保証する。ここ

は、JSONのデコードされたファイルです。この場合は

[{"1":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"roses","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]},{"2":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"roses","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]},{"5":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"roses daffodil","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]},{"3":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"daffodil","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]},{"4":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"daffodil","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]},{"5":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"roses daffodil","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]},{"6":[{"u":"testing","d":"2017\/04\/27","st":"Test","i":"roses daffodil","v":"1","t":"org","sp":"N\/A","k":"0","img":"--"}]}] 

このJSONは「バラの水仙」

+0

可能であれば、var_export()を実行して質問を更新すると参考になります。 –

+4

重複キーを持つ1つの配列はどのようになりますか? – hassan

+0

配列内に同じキーのインスタンスが複数ある場合、それらは上書きされます。インデックスは一意でなければなりません。 – Qirel

答えて

0

私は解決策を見つけました!少し長めになっていますが、うまくいきます!

$json = json_decode($json); 
$jsonoutc = $jsonout = ""; 
$arrid = $arrout = $disp = array(); 
foreach ($json as $null => $arr){ 
    foreach ($arr as $key => $null){ 
     $arrid[] = $key; 
    } 
} 
$vals = array_count_values($arrid); 
foreach ($vals as $val => $counted){ 
    if ($counted > $jsonoutc){ 
     $jsonoutc = $counted; 

    } 
} 
foreach ($vals as $val => $counted){ 
    if ($counted == $jsonoutc){ 
     $arrout[] = $val; 

    } 
} 
foreach ($arrout as $null => $val){ 
    foreach ($json as $null => $arr){ 
     foreach ($arr as $key => $list){ 
      if ($key == $val){ 
       $disp[$key] = $list; 
      } 
     } 
    } 
} 
print_r($disp); 
0

それが追加第二の例のためだっ作ら検索 - 各インデックスは一度だけ表示されます。

<?php 

$array[] = array('u' => 'test1u', 'd' => 'test1d'); 
$array[] = array('u' => 'test2u', 'd' => 'test2d'); 
$array[] = array('3' => 'test3u', '3' => 'test3d'); 
$array[] = array('u' => 'test1u', 'd' => 'test1d'); 
$array[] = array('u' => 'test2u', 'd' => 'test2d'); 

var_export($array); 
//echo("\n" . array_count_values($array) . "\n"); 

foreach($array as $k => $v){ 
    foreach($array as $ke => $ve){ 
      if($k == $ke) 
       continue; 
      if($v == $ve) { 
       $d[$k]=$v; 
       unset($array[$k]); 
      } 
    } 
} 

var_export($d); 

?> 

は残念ながらarray_count_values専用文字列とint型のために働くので、あなたは、複雑な値を持っているとき、それは動作しません: 最初のために、これは正常に動作する必要があります。

0

まず、配列には同じキーを使用できません。 live demoを確認してください。

<?php 

$array[] = array('u' => 'test1u', 'd' => 'test1d'); 
$array[] = array('u' => 'test2u', 'd' => 'test2d'); 
$array[] = array('u' => 'test3u', 'd' => 'test3d'); 
$array[] = array('u' => 'test1u', 'd' => 'test1d'); 
$array[] = array('u' => 'test2u', 'd' => 'test2d'); 

$array = array_map(function($v){return implode('-', $v);}, $array); 
$count = array_count_values($array); 
print_r($count); 
arsort($count); 
$max = current($count); 
while(current($count) == $max) 
{ 
    $arr = explode('-', key($count)); 
    $result[] = array('u' => $arr[0], 'd' => $arr[1]); 
    next($count); 
} 
print_r($result); 
関連する問題