Разделить массив на уникальные пары

Скажем, я начинаю с простого массива (который теоретически может быть любой длины):

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

Самое простое решение – использовать вложенные петли и строить комбинации, как вы идете, хотя обратите внимание, что сложность здесь O (n 2 ).

 $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

Наверное, не лучшее решение

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

В любом случае это работает

Исправлено из моего первоначального предложения о прыжке с оружием array_chunk()

Попробуйте это вместо этого:

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

Сладкое решение, Nev Stokes! Я изменил инструкцию while, чтобы избежать прерывания цикла, когда одно из значений равно 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); } } 
 $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);