2012-04-09 8 views
1

PHP-Array ist sehr flexibel und nützlich. Ich habe über 30 Array-Funktionen on the PHP.net array reference Seite gezählt. Einige von ihnen können mein Problem lösen, aber ich suche den besten, elegantesten Weg.Was ist die beste PHP-Array-Funktion beim Verschachteln von verschachtelten Arrays?

I 2 Arrays, genannt labor und cost, die jeweils eine Tabelle:

labor = array(
    0 => array('date' => date, 'labor'=> labor), 
    1 => array('date' => date, 'labor'=> labor), 
    ... 
); 

cost = array(
    0 => array('date' => date, 'cost'=> cost), 
    1 => array('date' => date, 'cost'=> cost), 
    ... 
); 

Mein Problem ist, dass manchmal die Anzahl der Tage, nicht übereinstimmen (dh, es gibt Tage, an denen Sie anfallen haben Kosten, obwohl Sie nichts für Arbeit ausgegeben haben, oder Tage, an denen Sie Arbeit hatten, aber keine Kosten) - das heißt, es gibt mehr Linien in einem Array als das nächste - keine Möglichkeit zu wissen, was ohne count() hat.

Was interessiert mich sind nur die Tage, die sowohl Arbeit hatte und kosten und ich möchte mit einer Reihe am Ende:

laborcost = array(
    0 => array('date' => date, 'labor'=> labor, 'cost' => cost), 
    1 => array('date' => date, 'labor'=> labor, 'cost' => cost), 
    ... 
) 

Ich dachte über array_intersect() oder eine der ‚u mit "Funktionen, aber endete total durcheinander. Bevor ich aufgab und meine eigene Array-Scan-Funktion schrieb, wollte ich herausfinden, ob es Ideen gibt, die mein Problem mit 1, möglicherweise 2 Codezeilen lösen.

+0

Haben Sie 'array_map()' versucht? –

+0

Ja, 'array_map'. Ich würde eine Klasse erstellen, dem Konstruktor ein Array zur Verfügung stellen, sie speichern und dann eine andere Methode in der Klasse als Callback für 'array_map' verwenden, an die das zweite Array geliefert werden kann. – halfer

+0

Habe Array_map noch nicht angeschaut - würde es mal anschauen. Vielen Dank! –

Antwort

2

Es gibt keine Schnittpunktfunktion, die eine benutzerdefinierte Vergleichsfunktion akzeptiert, mit der Sie die Arrays ändern können. Der einfachste Weg ist, es selbst zu tun.

Hier sind ein paar Beispiele:

O (2n + m)

// Remap dates as keys for faster lookups 
$result = $nlabor = $ncost = array(); 
foreach ($labor as $l) $nlabor[$l['date']] = $l; 
foreach ($cost as $c) $ncost[$c['date']] = $c; 

// Compare 
foreach ($nlabor as $date => $l) { 
    if (array_key_exists($date, $ncost)) { 
     $result[] = array_merge($l, $ncost[$date]); 
    } 
} 

~ O (n * m)

// Just compare them all 
$result = array(); 
foreach ($labor as $l) { 
    foreach ($cost as $c) { 
     if ($l['date'] == $c['date']) { 
      $result[] = array_merge($l, $c); 
      break; 
     } 
    } 
} 

Welcher Weg ist der beste hängt davon ab, wie viele Elemente Sie in jedem Array haben. Bei Verwendung auf kleineren Arrays ~ O (n * m) ist in Ordnung, während auf größeren Arrays O (2n + m) wird effizienter.

+0

Nun, dies spricht nicht wirklich meine Absicht an, die in Array_Funktionen eingebaute PHP zu verwenden, aber Sie verdienen die Antwort für die Berechnungen :) –

+0

Es gibt keine eingebaute Funktion, um zu tun, was Sie tun möchten. Alle 'array_u *' - Funktionen erlauben es nicht, die Arrays zu modifizieren, und 'array_map' und' array_walk' machen im Prinzip dasselbe wie oben, aber auf eine komplexere Art und Weise. – netcoder

0

Dies sollte den Trick tun. Nicht ganz so einfach wie eine einzelne Funktion.

+0

Hilft nicht - was ist, wenn die Kosten länger sind als die Arbeit? Was ist, wenn die Daten nicht übereinstimmen? Ich brauche nur passende Daten - nicht nur ein fusioniertes Array. –