Рассмотрим следующий массив:
$input = array('A', 'B', 'C', 'D');
Я ищу способ сделать цикл, хотя этот массив, записывая все возможные пары из двух значений. В этом примере: AB AC AD BC BD CD. Пожалуйста, не то, что BA не считается парой, поскольку AB уже упоминался:
$output = array( 'A' => 'B', 'A' => 'C', 'A' => 'D', 'B' => 'C', 'B' => 'D' );
Любые данные о том, как это начать, оцениваются!
$output=array(); for ($i=0;$i<sizeof($input);$i++) { $k=$input[$i]; for ($j=$i+1;$j<sizeof($input);$j++) { $v=$input[$j]; $output[]=array($k=>$v); } }
редактировать
По вашему мнению, реструктурированный результат
$output=array(); //See below for ($i=0;$i<sizeof($input);$i++) { $k=$input[$i]; $v=array(); for ($j=$i+1;$j<sizeof($input);$j++) { $v[]=$input[$j]; } $output[]=array($k=>$v); }
Это даст вам «D» => Array () как последнюю строку, если вы не хотите, чтобы hti вам нужно было изменить
for ($i=0;$i<sizeof($input);$i++) {
в
for ($i=0;$i<sizeof($input)-1;$i++) {
что-то вроде этого возможно;
$input = array('A', 'B', 'C', 'D'); $input_copy = $input; $output = array(); $i = 0; foreach($input as $val) { $j = 0; foreach($input_copy as $cval) { if($j < $i) break; $output[] = array($val => $cval); $j++; } $i++; } $output = array( 0 => array('A' => 'A'), 1 => array('A' => 'B'), 2 => array('A' => 'C'), ... );
Обратите внимание, что ваш выходной массив невозможен, так как каждый раз перезаписывается ключ
Это невозможно в PHP, так как массив PHP может иметь только уникальные ключи.
Вы можете получить вывод как
$output = array( 'A' => array('B','C','D'), 'B' => array('C','D') ); $input = array('A', 'B', 'C', 'D'); foreach($input as $key => $value){ $tempKey = $key; for($key +1 ; $key < count($input) ; $key++){ $result[$tempKey][] = $input[$key]; } }
Вы можете использовать этот общий метод:
function combine($inputArray, &$outputArray, $index, $combLen) { global $outstr; for ($i = $index; $i < count($inputArray); $i++) { $outstr.=$inputArray[$i]; if(strlen($outstr) == $combLen) { $outputArray[]= $outstr; } combine($inputArray, $outputArray, $i + 1, $combLen); $outstr = substr($outstr, 0, strlen($outstr)-1); } }
Смотрите на идеон
если вам нужно работать с парами в виде массивов
$pairs = []; foreach($a as $k => $v) { foreach(array_slice($a, $k + 1) as $k2 => $v2) { $pairs[] = [$v, $v2]; } }