PHP:如何识别和更改数组中的重复值


PHP: How to identify AND CHANGE duplicate values in an array?

好的,在php数组中有很多重复检测和删除的例子,使用array_unique()等,但如果你想找到dps,修改它们,在循环中再次检查,直到所有dps现在是唯一的呢?

我认为这有点像使用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  
)

在保留原始值(即大。再来一份(副本)……我已经看了几乎每一个PHP数组函数,试图想象一个策略…想法吗?

对于问题中的数组和在末尾添加数字(如果重复),您只需要在数组上循环一次并临时构建一个helper数组,该数组存储是否已经找到值(以及频率):

$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的。尽管如此,我仍然认为ID永远不会重复。