在单个数组中查找重复的键

时间:2013-12-23 13:35:49

标签: php arrays key

我有一个字典数组,如下所示

$foo = array(
    'key1' => 'value 1',
    'key1' => 'value 2',
    'key2' => 'value 3',
    'key2' => 'value 4',
    'key3' => 'value 5'
);

你可以看到有重复的键。所有键都是字符串。数组位于文件中并手动创建。它有近1000个条目,可能有很多重复的密钥。

如何找出重复的密钥?

我想得到的结果是具有重复项的键列表:

key1, key2, ...

所以我可以进入文件并修复这些键以使它们成为唯一的。任何格式都没问题,所以我知道这些键的名称。

key3没有重复,所以没关系。

非常感谢任何帮助。

感谢。

你们大多数人似乎都在告诉我同样的事情:)我知道我不能拥有多个钥匙。问题是这是一个平面文件中的手动创建的字典数组。创建它的人多次添加相同的密钥。问题是,一个页面上的key1有翻译A,但在其他页面上它应该有翻译B,但由于这两个值在我的词典数组中具有相同的键,因此它们都显示相同的值。

6 个答案:

答案 0 :(得分:3)

你做不到。一旦定义了数组,那些“重复键”就会折叠。相应的值将丢失。

答案 1 :(得分:1)

我认为这是一次性工作,以便清除文件中的某些输入数据而不是需要自动发生的事情。

如果您的数据最初是在CSV类型文件中并且您可以访问某些GNU工具,我经常会使用类似

的内容
$ cat filenamv.csv | cut -d, -f1  | sort | uniq -d

这应该是CSV文件的第一列,并打印任何重复的密钥。

您需要阅读各个命令(例如man uniq),以便在您的案例中使用正确的参数。

答案 2 :(得分:1)

每当您创建这样的数组时,您的第一个键'key1' => 'value 1'将被'key1' => 'value 2'替换,并继续这样做。因此,您将始终拥有唯一键,并保留最后一个值。

因此,您必须找到一种方法来消除重复密钥,然后再将它们存储到数组中。

您可以将它们加载到MySql中,触发一些查询。如果你想这样做,请告诉我,我会帮你解决问题。

答案 3 :(得分:0)

array_count_values()可能对此有所帮助:

<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>

http://www.php.net/manual/en/function.array-count-values.php

如果您对删除重复值感到满意,那么

array_unique()也能做得很好。

答案 4 :(得分:0)

我认为,“Niet the Dark Absol”是对的。无论如何,它应该看起来像这样删除重复的元素。

$foo2 = array();
foreach($foo as $key => $item)
{
     if (!array_key_exists($key, $foo2))
     {
         $foo2[$key] = $item;
     }
}

答案 5 :(得分:0)

如果PHP评估文件,则无法执行此操作,但您可能会尝试手动解析文件。

$existing_keys = array();
while (!feof($fh))
{
   $str = fgets($fh);
   list($key) = explode("=>", $str, 2);
   $key = trim($key);
   if (isset($existing_keys[$key]))
   {
      echo "Duplicate key $key\n";
   } else
   {
      $existing_keys[$key] = 1;
   }
}