【问题标题】:Find and replace duplicates in Array查找和替换数组中的重复项
【发布时间】:2012-10-24 07:38:35
【问题描述】:

我需要用一些随机值填充数组,但如果数组中有重复项,我的应用程序将无法正常工作。所以我需要编写脚本代码来查找重复项并将它们替换为其他一些值。 好的,例如我有一个数组:

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

因此结果应该是具有替换重复值的相同数组。

【问题讨论】:

  • 您可能需要先查看array_unique()array_replace(),然后再编写自己的方法;它们可能正是您所需要的。
  • 我检查了它,但它没有满足我的需求。感谢您尝试帮助我。
  • 如果你表达了你想要使用的替换字符串和你的确切预期结果,这个问题会更清楚。 minimal reproducible example@xZero

标签: php arrays replace find duplicates


【解决方案1】:

您可以只跟踪到目前为止看到的单词并随时替换。

// 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() (reference here) 来计算它出现的次数。

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

【讨论】:

    【解决方案2】:

    这里是如何生成唯一值和替换数组中重复值的示例

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

    完整的例子你可以看here webbystep.ru

    【讨论】:

      【解决方案3】:

      使用函数 array_unique()

      http://php.net/manual/en/function.array-unique.php查看更多信息

      【讨论】:

      • 感谢您帮助我。但它只是删除重复项。我想替换重复项而不是删除它。
      • 这可能会减小数组的大小——OP 不希望这样。
      【解决方案4】:
      $uniques = array();
      foreach ($charset as $value) 
         $uniques[$value] = true;
      $charset = array_flip($uniques);
      

      【讨论】:

      • 谢谢。但是如何使用呢?例如,在哪里指定哪些值将被替换?
      • 这可能会减小数组的大小——OP 不希望这样。
      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 2014-09-20
      • 2012-06-17
      • 2020-05-31
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多