У меня есть следующая проблема:
$multidmimensional = array( [0] => array( [0] => 1, [1] => 2, [2] => 3 ); [1] => array( [0] => 5, [1] => 6, [2] => 7 ); ... [2] => array( [0] =>,4 [1] => 5, ); );
Я могу иметь один или несколько (вложенных) массивов, и в качестве примера возьмем первые два из приведенных выше массивов:
Я должен переписать их следующим образом:
15 16 17 25 26 27 36 37 38
Если бы у меня были, например, три массива, я бы получил такой результат:
154 164 174 155 165 175 254 264 274 255 265 275 364 374 384 365 375 385
У меня возникли проблемы с созданием алгоритма, который бы устранил эту проблему. Может кто-нибудь мне помочь? Заранее спасибо.
Это хороший мозговой дразнящий вопрос. Вот что я придумал, см. Демо-версию для тестирования и настройки.
$multidimensional = array( 0 => array( 0 => 1, 1 => 2, 2 => 3, ), 1 => array( 0 => 5, 1 => 6, 2 => 7, ), 2 => array( 0 => 4, 1 => 5, ), ); // just your input $permutations = array(); $count = count($multidimensional); for ($i = 0; $i < $count; $i++) { $temp = array_map("permute",array($permutations),array($multidimensional[$i])); $permutations = $temp[0]; } print_r($permutations); // OUTPUT function permute($base,$add) { $result = array(); if (count($base) > 0) { foreach ($base AS $val1) { if (count($add) > 0) { foreach ($add AS $val2) { $result[] = $val1.$val2; } } else { $result = $base; } } } else { $result = $add; } return $result; }
$data = array ( '1' => array(5, 6, 7), '2' => array(9, 25, 14) ); for($i=0; $i<=count(array_keys($data)); $i++) { for($j=1; $j<=2; $j++) { $values[$i][] = $data[$j][$i]; } } for($i=0; $i<count($values); $i++) { shuffle($values[$i]); } $newData = array(); for($i=0; $i<3; $i++) { for($j=1; $j<=2; $j++) { $newData[$j][] = array_pop($values[$i]); } } print_r($newData);
в$data = array ( '1' => array(5, 6, 7), '2' => array(9, 25, 14) ); for($i=0; $i<=count(array_keys($data)); $i++) { for($j=1; $j<=2; $j++) { $values[$i][] = $data[$j][$i]; } } for($i=0; $i<count($values); $i++) { shuffle($values[$i]); } $newData = array(); for($i=0; $i<3; $i++) { for($j=1; $j<=2; $j++) { $newData[$j][] = array_pop($values[$i]); } } print_r($newData);
скрипка
Я не могу проверить это прямо сейчас, но это должно работать: (может содержать опечатки)
function permute($arrays){ if(count($arrays)<2) return $arrays[0];//TODO error on count == 0 $array1 = array_shift($arrays); $array2 = array_shift($arrays); $results = array(); foreach($array1 as $elementOfOne){ foreach($array2 as $elementOfTwo){ $results[] = $elemnetOfOne . $elementOfTwo; } } array_unshift($arrays, $results); return permute($arrays); }