2010-09-22 13 views
5

sagt, dass ich mit einem einfachen Array beginnen (die theoretisch beliebig lang sein können):Split-Array in einzigartige Paare

$ids = array(1,2,3,4); 

Was es ist die beste Lösung für das Aufspalten dieses Array in eine Reihe einzigartiger Paare wie:

$pair[0] = array(1,2); 
$pair[1] = array(1,3); 
$pair[2] = array(1,4); 
$pair[3] = array(2,3); 
$pair[4] = array(2,4); 
$pair[5] = array(3,4); 

Antwort

3

Die einfachste Lösung ist eine verschachtelte Schleife zu verwenden und Kombinationen zu bauen, wie Sie gehen, obwohl beachten Sie, dass die Komplexität hier O (n) ist.

$ids = array(1,2,3,4,4); 
$combinations = array(); 

$ids = array_unique($ids); // remove duplicates 
$num_ids = count($ids); 

for ($i = 0; $i < $num_ids; $i++) 
{ 
    for ($j = $i+1; $j < $num_ids; $j++) 
    { 
    $combinations[] = array($ids[$i], $ids[$j]); 
    } 
} 

dies bei http://www.ideone.com/9wzvP

+0

Sie könnten mit der 'in_array' Prüfung durch' Array_unique' auf '$ IDs' gehen. Und Sie können auch beschleunigen es wird durch "$ ids" als Voraussetzung vor den Schleifen gezählt (da es sich nicht ändern wird). Ich erwähne nur diese, da du die Komplexität nennst ... – ircmaxell

+0

@ircmaxell Wahr, dass man zuerst '$ ids' zählt, aber das wird die Komplexität nicht beeinflussen Ich glaube nicht, dass Sie 'array_unique' vor der Zeit verwenden können, aber es hängt vom Ziel des OPs ab, dh ob '$ ids = array (1,2,3,3)' , sollte [3,3] ein Ergebnis sein? –

+0

ich kann bestätigen, dass 3,3 kein Ergebnis – robjmills

1

Fest von meinem ersten Sprung-the-gun Vorschlag von array_chunk()

dies stattdessen versuchen:

$ids = array(1, 2, 3, 4); 
$out = array(); 

while ($item = array_shift($ids)) { 
    foreach ($ids as $key=>$value) { 
     $out[] = array($item, $value); 
    } 
} 
+2

'array_chunk' nicht tun, was der OP will, Blick auf die Beispielausgabe. OP möchte Kombinationen. –

+0

Ah, dumme mich. Ich habe die Ausgabe nicht richtig gelesen! –

1

in Aktion wahrscheinlich nicht die beste Lösung

$ids = array(1,2,3,4); 

$pairs = array(); 
foreach($ids as $key => $data){ 
    foreach($ids as $subkey => $subdata){ 
     if($subkey != $key){ 
      if(!in_array(array($subdata, $data) , $pairs)){ 
       $pairs[] = array($data, $subdata); 
      } 
     } 
    } 
} 

Auf jeden Fall funktioniert es

1

Süße Lösung, Nev Stokes! änderte ich den ‚while‘ Anweisung, um die Schleife zu vermeiden, brechen, wenn einer der Werte ist 0:

$ids = array(0, 1, 2, 3, 4); 
$out = array(); 

while (!is_null($item = array_shift($ids)) ) { 
    foreach ($ids as $key=>$value) { 
     $out[] = array($item, $value); 
    } 

} 
0
$ids = array(1,2,3,4); 
$result=array(); 
foreach($ids as $value_1) 
{ 
    foreach($ids as $value_2) 
    { 
    if($value_1 !=$value_2) 
    { 
     $result[]=array($value_1,$value_2); 
    } 
    } 
} 
echo "<pre>"; 
print_r($result);