2010-09-22 12 views
5

powiedzieć, że początek prostej matrycy (która teoretycznie może być o dowolnej długości):podziału tablicę do unikalnych par

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

co to najlepsze rozwiązanie dzielenia tej tablicy w tablicy unikalnych par, takich jak:

$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); 

Odpowiedz

3

Najprostszym rozwiązaniem jest użycie pętli zagnieżdżonych i budować kombinacje as you go, choć pamiętać, że tutaj jest złożoność O (n).

$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]); 
    } 
} 

Zobacz w działaniu na http://www.ideone.com/9wzvP

+0

Można uciec sprawdzeniu 'in_array', wykonując' array_unique' na '$ ids' .A możesz także przyspieszyć to przez liczenie '$ ids' jako warunek wstępny przed pętlami (ponieważ to się nie zmieni). Wspomnę o nich tylko dlatego, że wspominasz o złożoności ... – ircmaxell

+0

@ircmaxell Prawda o tym, że najpierw liczymy' $ ids', chociaż to nie wpłynie to na złożoność.Nie sądzę, że można użyć 'tablica_unique' przed czasem ... zależy to od celu OP, tj. jeśli' $ ids = array (1,2,3,3) , powinien [3,3] być wynikiem? –

+0

Mogę potwierdzić, że 3,3 nie powinno być wynikiem – robjmills

1

Usunięto z moim początkowym jump-the-gun sugestią array_chunk()

Spróbuj to zamiast:

$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' nie zrobi tego, co PO chce, patrzeć na wyjściu np. OP chce kombinacji. –

+0

Ah, głupiutki. Nie odczytałem wyniku poprawnie! –

1
nie

prawdopodobnie najlepszym rozwiązaniem

$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); 
      } 
     } 
    } 
} 

Zresztą to działa

1

Słodka rozwiązanie, Nev Stokes! Zmieniłem „while” oświadczenie, aby uniknąć pętli od zerwania, gdy jedna z wartości jest 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); 
Powiązane problemy