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

时间:2011-11-20 21:50:33

标签: php arrays duplicates array-filter

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

我认为这类似于使用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  
)

保留原始值(即big.dup和another.duplicate)...我已经查看了几乎每个PHP数组函数试图想象一个策略......想法?

2 个答案:

答案 0 :(得分:1)

对于你的问题中的数组以及如果重复的话在最后添加数字,你只需要遍历数组一次并临时构建一个辅助数组,该数组存储是否已经找到一个值(以及多久) :

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

Demo

答案 1 :(得分:0)

首先,我认为你有一个相当复杂的数组结构。

为什么不将它改为:

$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永远不会重复。