Question

I need to make app with will fill array with some random values, but if in array are duplicates my app not working correctly. So I need to write script code which will find duplicates and replace them with some other values. Okay so for example i have an 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 I'm able to specify.
return $ArrayWithReplacedValues;
}
?>

So result shall be the same array with replaced duplicated values.

Was it helpful?

Solution

You can just keep track of the words that you've seen so far and replace as you go.

// 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;
    }
}

For a somewhat-optimized solution (for cases where there are not that many duplicates), use array_count_values() (reference here) to count the number of times it shows up.

// 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;
    }
}

OTHER TIPS

Here the example how to generate unique values and replace recurring values in array

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');

Full example you can see here webbystep.ru

Use the function array_unique()

See more info at http://php.net/manual/en/function.array-unique.php

$uniques = array();
foreach ($charset as $value) 
   $uniques[$value] = true;
$charset = array_flip($uniques);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top