Справка по циклам Php dynamic nest

#php #dynamic #while-loop #nested-loops

#php #динамический #цикл while #вложенные циклы

Вопрос:

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

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

 $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, вложенный в другие, исходя из количества элементов в $array?

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

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

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

Комментарии:

1. Никогда не используйте циклы while, если известно количество циклов. Используйте для этого циклы for. Или foreach, если количество циклов известно неявно по количеству массивов.

2. я знаю, что это старый скрипт, и у меня нет времени его менять, и это излишне, если я все равно собираюсь его переписывать.

3. Вы просто хотите вычислить перестановки для a * или для всех возможных комбинаций для всех символов abcd?

4. Каждая буква может быть прописной или строчной независимо от других букв, я вывел, что возможные комбинации равны 2 ^ n, где n — количество букв. Итак, мне нужен скрипт для создания всех возможных конфигураций для любого значения n. Кроме того, каждая буква может быть только одна, и она должна быть в порядке от a-> z

Ответ №1:

Инициатором является рекурсия.

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

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


Мой 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;
}
  

Комментарии:

1. не могли бы вы, пожалуйста, привести мне пример?

2. функция работает, не считая того факта, что я не думаю, что $permtail она на самом деле устанавливается. ну что ж