|
Тема |
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") и изпуска началните нули, които са важни в нашия случай, понеже нулата я заменяме с А.
|
| |
|
|
|