2016-07-30 16 views
0

Ich vergleiche jedes Element des Arrays mit jedem anderen Element des Arrays und wenn zwei Elemente die gleiche Quelle/Ziel haben, verschmilze Ziel/Quelle I das innere Array mit Mitarbeitern z.Effizientere Art der Zusammenführung von zwei Arrays

0=> source - 3 target - 4 officers => 0 - 'Aberdeen Asset Management PLC' 
1=> source - 3 target - 4 officers => 0 - 'whatever' 

es würde

0=> source - 3 target - 4 officers => 0 - 'Aberdeen Asset Management PLC', 1 - 'whatever' 

Hier ist, wie die Daten aussehen zu

zusammengeführt werden: auf mehr Zeilen mit 1000

enter image description here

Mein Code ist wirklich ineffizient durch die gehen die Ausführung dauert etwa 90 Sekunden, was für solche Dinge nicht akzeptabel ist.

foreach ($edges as $i => &$edge) { 
     for ($j = $i + 1; $j < count($edges); $j++) { 
      if ($edge['source'] == $edges[$j]['source'] && $edge['target'] == $edges[$j]['target']) { 
       foreach ($edges[$j]['officers'] as $officer) { 
        array_push($edge['officers'], $officer); 
       } 
       array_splice($edges, $j, 1); 
      } 
     } 
    } 

Antwort

1

Ich glaube, Sie sollten dies tun (aktualisiert):

// we will have new array with officers 
$new_items = array(); 
foreach ($edges as $edge) { 
    // create unique keys for `source-target` and `target-source` pairs 
    $source_target = $edge['source'] . ':' . $edge['target']; 
    $target_source = $edge['target'] . ':' . $edge['source']; 

    // check if unique keys exists in `new_items` 
    if (!isset($new_items[$source_target]) && !isset($new_items[$target_source])) { 
     // if unique key doesn't exist - create a new one 
     $new_items[$source_target] = $edge; 
    } elseif (isset($new_items[$source_target])) { 
     // if unique key exists `$source_target` - add an officer to it 
     $new_items[$source_target]['officers'][] = $edge['officers'][0]; 
    } else { 
     // if unique key exists `$target_source` - add an officer to it 
     $new_items[$target_source]['officers'][] = $edge['officers'][0]; 
    } 
} 

// for returning to numeric indexes use `array_values` 
$new_items = array_values($new_items); 
+1

Und Sie können Ihre Probleme nicht selbst lösen? –

+0

@u_mulder Nun, es ist viel einfacher, wenn er ** Sie ** sagt, was er braucht und dann nur Paste kopieren. Schließlich tun Sie das umsonst, denn Sie haben nichts Besseres zu tun, als Code zu produzieren, damit andere davon profitieren können. Warum nicht allen Wünschen nachgehen, während Sie dabei sind? :) –

1

Die Lösung mit array_search, array_keys, array_slice und array_merge Funktionen:

// an exemplary array 
$edges = [ 
    0 => ['source' => 3, 'target' => 4, 'officers' => ['Aberdeen Asset Management PLC']], 
    1 => ['source' => 3, 'target' => 4, 'officers' => ['whatever']], 
    3 => ['source' => 4, 'target' => 7, 'officers' => ['Jason']], 
    4 => ['source' => 4, 'target' => 5, 'officers' => ['John']], 
    5 => ['source' => 4, 'target' => 7, 'officers' => ['Bourne']] 
]; 

foreach ($edges as $k => &$v) { 
    $next_slice = array_slice($edges, array_search($k, array_keys($edges)) + 1); 
    foreach ($next_slice as $key => $item) { 
     if ($item['source'] == $v['source'] && $item['target'] == $v['target']) { 
      $v['officers'] = array_merge($v['officers'], $item['officers']); 
      unset($edges[$k + $key + 1]); 
     } 
    } 
} 

print_r($edges); 

DEMO link

Verwandte Themen