Php динамические гнездовые петли помогают - PullRequest
0 голосов
/ 14 апреля 2011

Я понятия не имею, как к этому подойти.

Мой код длиннее, чем следующий, но это примерно так:

$array = array(array('A','a'),array('B','b'),array('C','c'),array('D','d'));
$array2 = array();
$i = 0;
while ($i < 2) {
    $j = 0;
    while ($j < 2) {
        $k = 0;
        while ($k < 2) {
            $l = 0;
            while ($l < 2) {
                $array2[] = $array[0][$i] . $array[1][$j] . $array[2][$k] . $array[3][$l];
                $l++;
            }
            $k++;
        }
        $j++;
    }
    $i++;
}

Хорошо, так как будет выглядеть результирующий $ array2например:

array ( 
    0 => 'ABCD',
    1 => 'ABCd', 
    2 => 'ABcD', 
    3 => 'ABcd', 
    4 => 'AbCD',
    ........ // i have omitted several almost identical lines
    14 => 'abcD', 
    15 => 'abcd',
)

Теперь мой вопрос заключается в следующем.

Как мне динамически создать цикл while, вложенный в другие, исходя из количества элементов в массиве $?

На данный момент, как вы можете видеть, есть 4 элемента (4 подмассива) и, следовательно, 4 цикла while.

Обратите внимание, не стесняйтесь менять имена переменных.

Спасибо, если выможет помочь, даже если вы просто дадите ссылку, но полный ответ предпочтительнее.

1 Ответ

1 голос
/ 14 апреля 2011

Оповещатель - рекурсия.

Создайте функцию, которая переставляет массив, и в этой функции вы вызываете ту же функцию с массивом без первого элемента.После этого вы переставляете первый элемент и добавляете его к результату предыдущего вызова функции.

Убедитесь, что у вас хорошее условие остановки (если он вызывается с пустым массивом, просто верните пустой массив), иначевы получите переполнение стека или индекс из-за ошибки.


Мой PHP немного ржавый, и я не уверен, что он скомпилируется, но он должен выглядеть примерно так:

function permutate($array) {
  if (empty($array)) {
    //Stop condition. 
    return $array;
  }
  //recursion
  $permtail = permutate(array_slice($array,1));
  //permtail now contains the permutated result of the array without 
  //the first element

  $result = array();
  //permutate the first element
  foreach($array[0] as $value) {
    //prepend it to all permutations
    foreach($permtail as $tail) {
      $result[] = array_merge((array)$value, $tail);
    }
  }
  return $result;
}
...