PHP Array Вопрос: Мне нужно создать приложение, которое заполнит массив некоторыми случайными значениями, но если в массиве дубликаты, мое приложение работает некорректно. Поэтому мне нужно написать код сценария, который найдет дубликаты и заменит их другими значениями. Хорошо, например, у меня есть массив:
<?PHP $charset=array(123,78111,0000,123,900,134,00000,900); function arrayDupFindAndReplace($array){ // if in array are duplicated values then -> Replace duplicates with some other numbers which ones im able to specify. return $ArrayWithReplacedValues; } ?>
Таким образом, результат должен быть тем же самым массивом с замещенными дублируемыми значениями.
Спасибо за любую помощь.
Вы можете просто отслеживать слова, которые вы видели до сих пор, и заменить их, когда идете.
// words we've seen so far $words_so_far = array(); // for each word, check if we've encountered it so far // - if not, add it to our list // - if yes, replace it foreach($charset as $k => $word){ if(in_array($word, $words_so_far)){ $charset[$k] = $your_replacement_here; } else { $words_so_far[] = $word; } }
Для несколько оптимизированного решения (для случаев, когда не так много дубликатов), используйте array_count_values () (ссылка здесь), чтобы подсчитать количество раз, когда оно появляется.
// counts the number of words $word_count = array_count_values($charset); // words we've seen so far $words_so_far = array(); // for each word, check if we've encountered it so far // - if not, add it to our list // - if yes, replace it foreach($charset as $k => $word){ if($word_count[$word] > 1 && in_array($word, $words_so_far)){ $charset[$k] = $your_replacement_here; } elseif($word_count[$word] > 1){ $words_so_far[] = $word; } }
Используйте функцию array_unique ()
Дополнительную информацию см. На странице http://php.net/manual/en/function.array-unique.php.
Вот пример, как создавать уникальные значения и заменять повторяющиеся значения в массиве
function get_unique_val($val, $arr) { if ( in_array($val, $arr) ) { $d = 2; // initial prefix preg_match("~_([\d])$~", $val, $matches); // check if value has prefix $d = $matches ? (int)$matches[1]+1 : $d; // increment prefix if exists preg_match("~(.*)_[\d]$~", $val, $matches); $newval = (in_array($val, $arr)) ? get_unique_val($matches ? $matches[1].'_'.$d : $val.'_'.$d, $arr) : $val; return $newval; } else { return $val; } } function unique_arr($arr) { $_arr = array(); foreach ( $arr as $k => $v ) { $arr[$k] = get_unique_val($v, $_arr); $_arr[$k] = $arr[$k]; } unset($_arr); return $arr; } $ini_arr = array('dd', 'ss', 'ff', 'nn', 'dd', 'ff', 'vv', 'dd'); $res_arr = unique_arr($ini_arr); //array('dd', 'ss', 'ff', 'nn', 'dd_2', 'ff_2', 'vv', 'dd_3');
сfunction get_unique_val($val, $arr) { if ( in_array($val, $arr) ) { $d = 2; // initial prefix preg_match("~_([\d])$~", $val, $matches); // check if value has prefix $d = $matches ? (int)$matches[1]+1 : $d; // increment prefix if exists preg_match("~(.*)_[\d]$~", $val, $matches); $newval = (in_array($val, $arr)) ? get_unique_val($matches ? $matches[1].'_'.$d : $val.'_'.$d, $arr) : $val; return $newval; } else { return $val; } } function unique_arr($arr) { $_arr = array(); foreach ( $arr as $k => $v ) { $arr[$k] = get_unique_val($v, $_arr); $_arr[$k] = $arr[$k]; } unset($_arr); return $arr; } $ini_arr = array('dd', 'ss', 'ff', 'nn', 'dd', 'ff', 'vv', 'dd'); $res_arr = unique_arr($ini_arr); //array('dd', 'ss', 'ff', 'nn', 'dd_2', 'ff_2', 'vv', 'dd_3');
Полный пример вы можете посмотреть здесь webbystep.ru
$uniques = array(); foreach ($charset as $value) $uniques[$value] = true; $charset = array_flip($uniques);