Find and replace duplicates in Array

后端 未结 4 1082
小蘑菇
小蘑菇 2021-01-13 20:14

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

相关标签:
4条回答
  • 2021-01-13 20:25

    Use the function array_unique()

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

    0 讨论(0)
  • 2021-01-13 20:35
    $uniques = array();
    foreach ($charset as $value) 
       $uniques[$value] = true;
    $charset = array_flip($uniques);
    
    0 讨论(0)
  • 2021-01-13 20:42

    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;
        }
    }
    
    0 讨论(0)
  • 2021-01-13 20:48

    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

    0 讨论(0)
提交回复
热议问题