2016-03-31 6 views
0

Ich habe ein mehrdimensionales Array, von dem ich eindeutige Unterwerte erhalten möchte, aber auch wie oft diese einzelnen Unterwerte aufgetreten sind.Mehrdimensionales Array - Erhalte eindeutige Werte, zähle aber alle Duplikate

Zum Beispiel würde dies mein Start Array sein:

[0] => Array 
     (
      [0] => Array 
       (
        [id] => 1533438473619168 
       ) 
      [1] => Array 
       (
        [id] => 3333333333333333 
       ) 
     ) 
[1] => Array 
     (
      [0] => Array 
       (
        [id] => 1533438473619168 
       ) 
      [1] => Array 
       (
        [id] => 5555555555555555 
       ) 
     ) 
[2] => Array 
     (
      [0] => Array 
       (
        [id] => 1533438473619168 
       ) 
      [1] => Array 
       (
        [id] => 77777777777777777 
       ) 
     ) 

Am Ende würde Ich mag ein Array haben, die wie folgt aussieht:

[0] => Array 
     (
      [0] => Array 
       (
        [id] => 1533438473619168 
        [count] => 3 
       ) 
      [1] => Array 
       (
        [id] => 3333333333333333 
        [count] => 1 
       ) 
      [2] => Array 
       (
        [id] => 5555555555555555 
        [count] => 1 
       ) 
      [3] => Array 
       (
        [id] => 77777777777777777 
        [count] => 1 
       ) 
     ) 

Gibt es eine allgemeine/einfache Möglichkeit, dies zu tun, ohne das erste Array für jeden Wert zu durchlaufen, die Werte in einem temporären Array zu vergleichen/zu speichern, sie zu überprüfen und zur Zählung hinzuzufügen?

+1

Nein, es gibt keinen einfacheren Weg. – Barmar

+0

ID als Schlüssel für neues Array verwenden, um Vergleich/Überprüfung zu vermeiden. Dann können Sie es mit 'array_values' – fusion3k

+0

für Starter entfernen ich würde alle Ihre Arrays zusammenführen, dann müssen Sie nur durch ein Array durchlaufen. – Jester

Antwort

1

Da Sie sich nur mit den tiefsten Werten des Arrays beschäftigen, scheint die Verwendung von array_walk_recursive dafür geeignet zu sein. Beachten Sie, dass im Callback eine Referenz auf das Ausgabe-Array $counted verwendet wird.

array_walk_recursive($ids, function($id, $k) use (&$counted) { 
    $counted[$id] = isset($counted[$id]) ? $counted[$id] + 1 : 1; 
}); 

die ID als Schlüssel in dem $counted Array wird das Zählen vereinfachen. Das Ergebnis wird etwas anders sein als Ihre vorgeschlagene Ausgabe, aber meiner Meinung nach wäre es einfacher zu verwenden. (z.B. foreach ($counted as $id => $count) {...).

$counted = array(
    "1533438473619168" => 3 
    "3333333333333333" => 1 
    "5555555555555555" => 1 
    "77777777777777777" => 1); 
+0

Danke, ich werde dies versuchen, um zu sehen, ob es effizienter als meine derzeitige Lösung ist, aber beide scheinen ein temporäres Array für den Speicher und die gleichen Codezeilen zu verwenden. –

Verwandte Themen