|
Тема
|
Помощ за цикъл с масив
|
|
Автор |
daxen (Добре Познат) |
Публикувано | 06.09.07 22:07 |
|
Здравейте ,
седя си тука и се чудя една простотия как да направя и нищо не ми идва
в главата , та реших да питам :
имам един масив
$array[0]="A";
$array[1]="B";
$array[2]="C";
$array[3]="D";
не мога да се сетя как да го завъртя в цикъл така че като се извърти да го
дабави още пак , така че да се получи нещо от сорта като го принтвам
A,B,C,D,AA,AB,AC,AD,AAA,AAB,AAC,AAD,ABA,ABC,ABD,ACA и тн. до 10 символа - примерно=
Моля ви да ми отворите малко очите :)
| |
Тема
|
Re: Помощ за цикъл с масив
[re: daxen]
|
|
Автор |
croesus (?!?) |
Публикувано | 07.09.07 14:54 |
|
По какъв начин се образуват елементите в тази редица? Дали могат да започват с всяка от буквите A, B, C и D или само с А, както си показал?
Ако могат да започват с всяка от четирите букви то значи при N символа за дължина ще имаш 4^N елемента, а сумарно със стринговете с по-малка дължина - (4^(N+1) - N)/3. При 10 символа - 1,4 милиона елемента. Хм, за какво ти е такъв масив?
Редактирано от croesus на 07.09.07 14:55.
| |
Тема
|
Re: Помощ за цикъл с масив
[re: croesus]
|
|
Автор |
daxen (Добре Познат) |
Публикувано | 07.09.07 16:12 |
|
Да трябва да извърти всички комбинации и като ги извърти , да добави още един масив и да върти комбинациите с него , и точно това не ми ясно как като извърти всички комбинации да добави още един път масива , а иначе май се сещаш за какво ми е :)
| |
Тема
|
Re: Помощ за цикъл с масив
[re: daxen]
|
|
Автор |
croesus (?!?) |
Публикувано | 07.09.07 17:59 |
|
$arr[0] = "A";
$arr[1] = "B";
$arr[2] = "C";
$arr[3] = "D";
function extend_array($max_str_len, &$arr_ref)
{
$search_arr = array("0","1","2","3");
$replace_arr = array("A","B","C","D");
$index_offset = 4;
for($i = 2;$i <= $max_str_len;$i++)
{
for($j = 0;$j < pow(4, $i);$j++)
{
$next_num = base_convert($j, 10, 4);
$next_num = str_repeat("0", $i - strlen($next_num)).$next_num;
$arr_ref[$index_offset + $j] = str_replace($search_arr, $replace_arr, $next_num);
}
$index_offset += pow(4, $i);
}
}
extend_array(4, $arr);
print_r($arr);
Идеята е малко шашава - ако "редим" стринговете с определена дължина и почваме с индекс 0, то за всеки елемент на масива стойността му ще е равна на индекса му, само че в четворична система (при заменки A=0, B=1, C=2, D=3).
Обратното също е вярно - ако вземем числата от 0 до 4^N и ги обърнем в четворична система, след което направим заменките - 0=A, 1=B, 2=C, 3=D, то ще получим неповтарящите се комбинации от четирите букви, които търсиш. Тъй като обаче масива от стрингове с дължина N се долепя до вече готовите с дължини 1, 2, ... N-1 то първият му индекс няма да е 0, а ще малко изместен, което се постига с променливата $index_offset. Редът пък $next_num = str_repeat("0", $i - strlen($next_num)).$next_num; е понеже base_convert не връща пълнотекстови стрингове (т.е. "0012", вместо "12") и изпуска началните нули, които са важни в нашия случай, понеже нулата я заменяме с А.
| |
Тема
|
Re: Помощ за цикъл с масив
[re: croesus]
|
|
Автор |
daxen (Добре Познат) |
Публикувано | 07.09.07 18:57 |
|
Благодаря ти за подробното обяснение,
върши ми перфектна работа :)
| |
|
|
|
|