#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
она на самом деле устанавливается. ну что ж