如何在数组中查找重复值的索引

时间:2011-10-31 10:02:58

标签: php algorithm

我有两个数组,我用来填充表的array1和array2,所以array1 [5]和array2 [5]都填充相同的行,但我想编写一个删除array1 [i]的函数和array2 [i]如果array1 [i]是array1 [j]的副本,对于某些j小于i,其中i是任意正整数。

为了实现这一点,我要计算array1中重复值的索引,然后在填充表之前使用此信息从array1和array2中删除这些索引的条目。

感激地收到任何想法。

感谢。

4 个答案:

答案 0 :(得分:2)

array_unique函数删除了dupes,但保留了密钥。然后你可以遍历另一个数组并删除第一个数组中不存在的键。

$array1 = array_unique($array1);
foreach ($array2 as $key => $val) {
    if (!array_key_exists($key,$array1)) unset($array2[$key]);
}

答案 1 :(得分:0)

$array1_keys = array_keys($array1); // all keys
$unique = array_keys(array_unique($array1)); // keys of unique values
$duplicate = array_diff($array1_keys, $unique_keys); // keys of the duplicate values
foreach($duplicate as $key){
    unset($array2[$key]);
}

旁注:请注意,array_diff使用字符串转换进行比较。如果你的数组包含非标量值,你应该看看array_udiff。

编辑:我眼中的Mingos帖子并不完全适合这个问题,看起来我错了:D

答案 2 :(得分:0)

如果您的数组键是有意义的而不仅仅是基于0的索引,并且您希望使用最低键保留重复条目(正如您在问题中指出的那样),那么您需要先对数组进行排序。如果不这样做,您将获得数组中每个重复值的第一个条目,而不是最低键的条目。比较

$array = array( 5 => 'foo', 1 => 'bar', 2 => 'foo', 3 => 'bar' );
$array = array_unique( $array );

var_dump( $array );

$array = array( 5 => 'foo', 1 => 'bar', 2 => 'foo', 3 => 'bar' );
ksort( $array );
$array = array_unique( $array );

var_dump( $array );

答案 3 :(得分:0)

在关联数组中,您可以使用 array_count_values轻松获得一个项目计数器,以检测重复和第一次出现的情况,操作简单,就像在这种情况下(使用关联数组,其中$ array_key是要计数的键)

$index = null;
$array_by_columns = array_count_values(array_column($associative_array, $array_key);
foreach($array_by_columns) as $key => $ocurrences){
   if($ocurrences > 1){
      $index = $key;
   }
}

如果您有$index,则重复的元素也是数组中的索引。 行中更紧凑的方式:

$index = null;
foreach(array_count_values(array_column($associative_array, $array_key)) as $key => $ocurrences)if($ocurrences > 1) $index = $key;

数据示例:

[ARRAY] (start)
n0
KEY = 0
VALUE = {"user":"1","points":"10"}
n1
KEY = 1
VALUE = {"user":"4","points":"10"}
n2
KEY = 2
VALUE = {"user":"5","points":"30"}
n3
KEY = 3
VALUE = {"user":"1","points":"40"}
[ARRAY] (end)

更多信息: