2010-09-22 112 views
5

說我從一個簡單的陣列(其可以是任何長度的理論上):拆分陣列分成獨特對

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

什麼它用於分割該陣列的最佳解決方案爲獨特的對象的數組:

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

回答

3

最簡單的解決方法是使用一個嵌套循環,構建組合,當您去,但是請注意,這裏複雜度爲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]); 
    } 
} 

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

+0

你可以逃脫了'做in_array'檢查'array_unique'上'$ ids'。而且你還可以速度它由之前的循環計數'$ ids'爲前提的(因爲它不會改變)。我只是因爲你提到的複雜性提到這些... – ircmaxell 2010-09-22 15:01:37

+0

@ircmaxell真有關第一計數'$ ids',儘管這不會影響的複雜性,我不認爲你可以使用'array_unique'的時間提前,但...這取決於OP的目標。即如果'$ IDS =陣列(1,2,3,3)' ,應該[3,3]是結果? – 2010-09-22 15:04:54

+0

我可以確認3,3不應該是結果 – robjmills 2010-09-22 15:05:50

1

array_chunk()

我最初的跳躍槍口建議固定試試這個:

$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'不會做OP想要什麼,看一下例子輸出。 OP希望組合。 – 2010-09-22 14:46:50

+0

啊,傻了。我沒有正確閱讀輸出! – 2010-09-22 14:48:37

1

可能不是最好的解決辦法

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

在操作中查看反正它的工作原理

1

甜的解決方案,內華達州斯托克斯! 我改變了「而」語句,以避免環路斷裂時的一個值是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);