GNU
Guest
Переименовать одинаковые элементы массива
Ничего в голову не лезет, подскажите алгоритм покрасивее, а может и не в массиве дело...
ЗАДАЧА:
Файл со строками, в каждой строке последовательность символов,
встречаются одинаковые последовательности
1. aaabbbccc
2. aaaaaaaaa
3. bbbcccaaa
4. aaaaaaaaa
5. ddddddddd
...
n. dddfgtyhf
ЦЕЛЬ: нужно заменить каждый повторяющийся элемент на другой уникальный.
Допущения: а) достаточно в начале следующего повторяющегося элемента приписать цифру 1,2 и т.п.
б) полагаем, что после приписки цифры получившийся элемент будет уникальним (т.е. не совпадет с другим уже существующим)
ВАРИАНТ РЕШЕНИЯ:
1. файл загоняем в массив $d;
2. $k=array_count_values ($d);
3. foreach ($k as $key=>$value)
{
if ($value)>1
$i=0;
array_walk(&d, 'func', $key)
}
где сама функция func() проверяет совпадает ли элемент с переданным значением $key, и формирует вместо него $i.$key,
после чего увеличивает $i на единицу
что еще неудобно - $i должна быть глобальной переменной, иначе func() приписывает один и тот же счетчик (0 в данном случае) ко все повторяющися элементам, а требуется чтобы к первому - '0', ко второму - '1' и т.д.
Все как-то громоздко и запутанно. Гуру, просветите, может, есть более изящное решение?
Ничего в голову не лезет, подскажите алгоритм покрасивее, а может и не в массиве дело...

ЗАДАЧА:
Файл со строками, в каждой строке последовательность символов,
встречаются одинаковые последовательности
1. aaabbbccc
2. aaaaaaaaa
3. bbbcccaaa
4. aaaaaaaaa
5. ddddddddd
...
n. dddfgtyhf
ЦЕЛЬ: нужно заменить каждый повторяющийся элемент на другой уникальный.
Допущения: а) достаточно в начале следующего повторяющегося элемента приписать цифру 1,2 и т.п.
б) полагаем, что после приписки цифры получившийся элемент будет уникальним (т.е. не совпадет с другим уже существующим)
ВАРИАНТ РЕШЕНИЯ:
1. файл загоняем в массив $d;
2. $k=array_count_values ($d);
3. foreach ($k as $key=>$value)
{
if ($value)>1
$i=0;
array_walk(&d, 'func', $key)
}
где сама функция func() проверяет совпадает ли элемент с переданным значением $key, и формирует вместо него $i.$key,
после чего увеличивает $i на единицу
что еще неудобно - $i должна быть глобальной переменной, иначе func() приписывает один и тот же счетчик (0 в данном случае) ко все повторяющися элементам, а требуется чтобы к первому - '0', ко второму - '1' и т.д.
Все как-то громоздко и запутанно. Гуру, просветите, может, есть более изящное решение?
