PHP: Как идентифицировать И ИЗМЕНИТЬ повторяющиеся значения в массиве?

Хорошо, есть много примеров дублирования обнаружения и удаления в php-массивах, используя array_unique () и т. Д., Но что, если вы хотите найти дубликаты, изменить их, снова проверить в цикле, пока все дубликаты не станут уникальными?

Я думаю, что это что-то вроде использования array_filter () … так как более конкретный пример, вот что получилось бы из инструкции sql примерно так:

SELECT id, list.comboname FROM list INNER JOIN ( SELECT comboname FROM list GROUP BY comboname HAVING count(id) > 1 ) dup ON list.comboname = dup.comboname 

К массиву дубликатов в таблице:

 Array ( [0] => 49 [1] => big.dup [2] => 233 [3] => another.duplicate [4] => 653 [5] => big.dup [6] => 387 [7] => big.dup [8] => 729 [9] => another.duplicate [10] => 1022 [11] => big.dup ) 

Теперь я хочу, чтобы некоторые PHP удаляли символы до тех пор, пока они не были уникальными [или добавили числа, если необходимо, до конца]

Таким образом, результат:

 Array ( [0] => 49 [1] => big.dup [2] => 233 [3] => another.duplicate [4] => 653 [5] => big.du [6] => 387 [7] => big.d [8] => 729 [9] => another.duplicat [10] => 1022 [11] => big.dup1 ) 

Сохраняя исходное значение (то есть big.dup и another.duplicate) … Я просмотрел почти каждую функцию массива PHP, пытаясь представить стратегию … идеи?

Для массива в вашем вопросе и для добавления чисел в конце, если это дубликат, вам нужно только один раз перебрать массив по одному массиву и создать временный массив вспомогательного массива, который хранит, если значение уже найдено (и как часто):

 $found = array(); foreach($array as &$value) { if (is_int($value)) continue; # skip integer values if (isset($found[$value])) { $value = sprintf('%s-%d', $value, ++$found[$value]); } else { $found[$value] = 0; } } unset($value); 

демонстрация

Прежде всего, я думаю, у вас довольно сложная структура массива.

Почему бы вам не изменить его на что-то вроде:

 $arr = array( '49' => 'big.dup', '233' => 'another.duplicate', '653' => 'big.dup', '387' => 'big.dup', '729' => 'another.duplicate', '1022' => 'big.dup', ); 

Таким образом, вы можете легко проверить дубликат, используя что-то вроде этого:

 $arr = array( '49' => 'big.dup', '233' => 'another.duplicate', '653' => 'big.dup', '387' => 'big.dup', '729' => 'another.duplicate', '1022' => 'big.dup', ); $arr_val = array(); foreach( $arr as $key => $val) { if(isset($arr_val[ $val ])) { $arr_val[ $val ]++; $arr[ $key ] = $val . $arr_val[ $val ]; } else { $arr_val[ $val ] = 0; } } 

Или, если вы настаиваете на использовании этой сложной структуры массива, вы можете изменить код выше:

 $arr_val = array(); foreach( $arr as $key => $val) { if(isset($arr_val[ $val ]) && !is_numeric( $val ) ) { $arr_val[ $val ]++; $arr[ $key ] = $val . $arr_val[ $val ]; } else { $arr_val[ $val ] = 0; } } 

Вы можете заметить, что здесь не так много. Я просто добавляю && !is_numeric($val) к нему, как я думаю, вы не захотите обработать ID. Хотя, я все еще думаю, что идентификатор никогда не будет дублироваться.