2017-04-27 2 views
0

Ich habe ein multidimensionales Array und ich möchte nur die Einträge mit den meisten Duplikate zu halten. Der nächste, den ich bekam, war:Return-Array enthält Duplikate PHP

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

aber das funktioniert nur für eindimensionale Arrays und gibt alle Duplikate aus. Wie würde ich das machen?

Beispiele für gewünschten Ausgang:

wenn das Array ist:

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

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

und wenn das Array zurückgeben sollte:

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 
    ) 
) 

soll es array([1] => ([u] => test1u [d] => test1d)[2] => ([u] => test2u [d] => test2d)) zurückkehren

aber wenn das Array:

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 
    ) 
) 

sollte es nur array([1] => ([u] => test1u [d] => test1d)) zurückkehren

EDIT:

gibt es doppelte Einträge in dem Array, da das Array von $arr = json_decode($arr); kam und die ursprüngliche JSON hatte Duplikat Einträge. Wenn es einen besseren Weg gibt, dies zu tun, ohne den JSON zu dekodieren, lass es mich wissen.

Dies wird als Teil eines Suchprogramms verwendet. JSON ist ein Array aller Einträge aus dem Quell-Array, die die Kriterien für einen der Suchbegriffe erfüllen. Wenn Sie die Einträge mit den meisten Duplikaten beibehalten, ist sichergestellt, dass diese Einträge die meisten, wenn nicht alle Suchbegriffe enthalten.

hier die JSON-Datei decodiert werden:

[{"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":"--"}]}] 

in diesem Fall ist die Suche, die diese JSON für „Rosen Narzisse“

gemacht war
+0

Tun Sie eine 'var_export()' und aktualisieren Sie Ihre Frage, wenn möglich, wäre hilfreich. –

+4

Wie könnte ein Array mit Duplikaten Schlüssel sein? – hassan

+0

Wenn mehrere Instanzen desselben Schlüssels in einem Array vorhanden sind, werden sie überschrieben. Indizes müssen eindeutig sein. – Qirel

Antwort

0

ich habe die lösung gefunden! etwas langatmig, aber es funktioniert!

$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

das zweite Beispiel es hinzufügen - nur kann jeder Index einmal erscheinen . für die erste sollte dies funktionieren:

<?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); 

?> 

leider array_count_values nur für String und int funktioniert, so dass es nicht funktioniert, wenn Sie komplexe Werte haben.

0

Zuerst können Sie Array nicht denselben Schlüssel haben. Überprüfen Sie die 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);