Переименовать одинаковые элементы массива

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' и т.д.

Все как-то громоздко и запутанно. Гуру, просветите, может, есть более изящное решение?
 

SiMM

Новичок
Без б ;)
PHP:
$in = array('aaabbbccc',
            'aaaaaaaaa',
            'bbbcccaaa',
            'aaaaaaaaa',
            'ddddddddd',
            'dddfgtyhf');

$out = array();
foreach ($in as $v){
  for ($d = ''; isset($out[$d.$v]); $d++);
  $out[$d.$v] = $d.$v;
}
print_r(array_values($out));
 

GNU

Guest
Автор оригинала: SiMM
Без б ;)
PHP:
$in = array('aaabbbccc',
            'aaaaaaaaa',
            'bbbcccaaa',
            'aaaaaaaaa',
            'ddddddddd',
            'dddfgtyhf');

$out = array();
foreach ($in as $v){
  for ($d = ''; isset($out[$d.$v]); $d++);
  $out[$d.$v] = $d.$v;
}
print_r(array_values($out));
гениально!

когда смотрю на такие примеры, начинаю бояться, что никогда не научусь программировать :(

Спасибо!
 
Сверху