Скажем, я начинаю с простого массива (который теоретически может быть любой длины):
$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); } }
$ pair = array_chunk ($ ids, 2);
$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);