2011-01-03 6 views
11

Ich habe ein mehrdimensionales Array-Setup wie folgt bekommen:Wie können Sie ein multidimensionales Array einzigartig machen?

array(
    [0]=> 
    array(
    ["name"]=> "Foo" 
    ["slug"]=> "Bar" 
) 
    [1]=> 
    array(
    ["name"]=> "Foo" 
    ["slug"]=> "Bar" 
) 
    [2]=> 
    array(
    ["name"]=> "Test 1" 
    ["slug"]=> "test-1" 
) 
    [3]=> 
    array(
    ["name"]=> "Test 2" 
    ["slug"]=> "test-2" 
) 
    [4]=> 
    array(
    ["name"]=> "Test 3" 
    ["slug"]=> "test-3" 
) 
) 

Was ist die beste Art und Weise durch die Gegend nach Duplikaten Werte in „name“ zu suchen und zu entfernen, sie wäre, so dass jeder Wert in dem mehrdimensionalen Array ist einzigartig?

Vielen Dank im Voraus!

+0

Angenommen, Sie haben einen doppelten 'Namen', aber der' slug'-Wert variiert - was erwarten Sie vom Ergebnis? (Welches Duplikat sollte entfernt/gelöscht werden?) –

+0

@Brad Christie, in diesem speziellen Fall wird der Name/Slug Combo nicht variieren. Vielen Dank für Ihren Kommentar! :) – hsatterwhite

Antwort

8

Da Alternativen jedem gegeben, hier ist eine Lösung für das Problem bei der Hand. Manchmal müssen wir mit den Daten arbeiten, die wir haben, nicht so, wie wir es wollen. Davon abgesehen entfernt das alle nachfolgenden Einträge aus dem Array, die Duplikate sind.

$array = Array(
    Array(
    'name' => 'Test 3', 
    'slug' => 'test-3' 
), 
    Array(
    'name' => 'Foo', 
    'slug' => 'Bar' 
), 
    Array(
    'name' => 'Foo', 
    'slug' => 'Bar' 
), 
    Array(
    'name' => 'Test 1', 
    'slug' => 'test-1' 
), 
    Array(
    'name' => 'Test 2', 
    'slug' => 'test-2' 
), 
    Array(
    'name' => 'Test 3', 
    'slug' => 'test-3' 
), 
); 
var_dump($array); 

for ($e = 0; $e < count($array); $e++) 
{ 
    $duplicate = null; 
    for ($ee = $e+1; $ee < count($array); $ee++) 
    { 
    if (strcmp($array[$ee]['name'],$array[$e]['name']) === 0) 
    { 
     $duplicate = $ee; 
     break; 
    } 
    } 
    if (!is_null($duplicate)) 
    array_splice($array,$duplicate,1); 
} 
var_dump($array); 

, die wie folgt aussehen:

array(6) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 1" 
    ["slug"]=> 
    string(6) "test-1" 
    } 
    [4]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 2" 
    ["slug"]=> 
    string(6) "test-2" 
    } 
    [5]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
} 
array(4) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 3" 
    ["slug"]=> 
    string(6) "test-3" 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(3) "Foo" 
    ["slug"]=> 
    string(3) "Bar" 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 1" 
    ["slug"]=> 
    string(6) "test-1" 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(6) "Test 2" 
    ["slug"]=> 
    string(6) "test-2" 
    } 
} 
+1

Danke für die Lösung Brad! Ich mag Ihre Sicht auf die Pflege des Problems und das funktioniert für mich.Obwohl ich den Vorschlag von @Gobs annehmen werde, in eine Hashtabelle zu schauen, da ich das noch nie gemacht habe. Gute Gelegenheit zu lernen. :) – hsatterwhite

+0

Hey, probier dieses One-Liner Baby aus: '$ input = array_map ('unserialize', array_unique (array_map ('serialize', $ input)));' https://stackoverflow.com/a/946300/3063226 – Heitor

0

Wenn ich nur auf Ihren speziellen Fall schaue, würde ich empfehlen, eine Hash-Tabelle anstelle eines 2-dimensionalen Arrays zu verwenden. Wenn Sie Ihren "Namen" als Schlüssel im Hash verwenden, wäre jeder Eintrag eindeutig.

Gibt es einen spezifischen Bedarf für das multidimensionale Array?

+0

Niemals eine Hash-Tabelle verwendet, aber ich werde sicherlich schauen, wie Sie vorgeschlagen. Keine spezielle Notwendigkeit für das multidimensionale Array, es ist nur, wie ich die Daten zu der Zeit vorbereitet habe. Danke für deine Anregung und Hilfe. :) – hsatterwhite

24

Sie können ein assoziatives Array verwenden.

$temp_array = array(); 
foreach ($array as &$v) { 
    if (!isset($temp_array[$v['name']])) 
     $temp_array[$v['name']] =& $v; 
} 

Dies erstellt ein temporäres Array mit $v['name'] als Schlüssel. Wenn bereits ein Element mit demselben Schlüssel vorhanden ist, wird es dem temporären Array nicht hinzugefügt.

Sie können die assoziativen Arrays in eine sequenzielle Array zurück zu konvertieren,

$array = array_values($temp_array); 

Beispielcode und Ausgabe mit: http://codepad.org/zHfbtUrl

+1

Ich mag das, es ist ein ziemlich einfaches und kompaktes Mittel, um den Job zu machen. Vielen Dank für Ihre Hilfe und einen Link zu einem funktionierenden Beispiel! :) – hsatterwhite

5
$array = array(
    0 => array(
     "name"=> "Foo", 
     "slug"=> "Bar" 
    ), 
    1 => array(
     "name"=> "Foo", 
     "slug"=> "Bar" 
    ), 
    2 => array(
     "name"=> "Test 1", 
     "slug"=> "test-1" 
    ), 
    3 => array(
     "name"=> "Test 2", 
     "slug"=> "test-2" 
    ), 
    4 => array(
     "name"=> "Test 3", 
     "slug"=> "test-3" 
    ) 
); 



function array_unique_by_key (&$array, $key) { 
    $tmp = array(); 
    $result = array(); 
    foreach ($array as $value) { 
     if (!in_array($value[$key], $tmp)) { 
      array_push($tmp, $value[$key]); 
      array_push($result, $value); 
     } 
    } 
    return $array = $result; 
} 

array_unique_by_key($array, "name"); 
0
function multi_array_unique_by_value($array, $colon = '') 
{ 
    $ret_array = array(); 
    $has_array = array(); 
    foreach($array as $item) 
    { 
     $item_array = (array)$item; 
     if(!in_array($item_array[$colon], $has_array)) 
     { 
      array_push($ret_array, $item); 
      array_push($has_array, $item_array[$colon]); 
     } 
    } 
    return $ret_array; 
} 

Sie können Ihre Array hier geben und einen Doppelpunkt Namen geben einzigartig zu machen.

Auf diesem Code haben Sie multidimensionales Array, wir empfehlen dieses Array, welches Spaltenindex für uns, wir schieben diese Spaltenwerte. Und wenn derselbe Wert ist, wird kein Rückgabe-Array hinzugefügt.

Also diese Lösung für array_unique für 1 column.

+0

Kannst du besser erklären, was hier passiert? – Mike

0

Viel einfachere Lösung für Ihr multidimensionales Array.

$unique = array_map('unserialize', array_unique(array_map('serialize', $array))); 

echo "<pre>"; 
print_r($unique); 
+0

können Sie auch verwenden 'array_map (" json_decode ", array_unique (array_map (" json_encode ", $ final))) , wenn Sie Daten in der Datenbank speichern. – manish1706