2010-09-22 171 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);