如何显示包含相同值的键?

时间:2016-02-07 14:35:15

标签: php

我目前只是想弄清楚如何显示包含相同值的键。

我有一个包含键和值的数组,我使用了一个语句 if(array_count_values($arr) > 1)仅在数组中存在重复值时才打印。但是我不知道如何打印重复值键。

 if(array_count_values($arr) > 1) {
  echo "The following files are the same: \n";
 }

$ arr里面是键和值。键是文件名,值是它们的inode。

这是一个示例数组

[test1.php] => 130313 [test2.php] => 130333 [test3.php] => 130313 [test4.php] => 140393

如何打印The following files are the same: test1.php, test2.php

3 个答案:

答案 0 :(得分:0)

$histogram = array();
foreach ($arr as $k => $v) {
    if (array_key_exists($v, $histogram)) {
        $histogram[$v][] = $k;
    } else {
        $histogram[$v] = array($k);
    }
}

foreach ($histogram as $keys) {
    echo 'The following files are the same: ' . implode(', ', $keys) . "<br />\r\n";
}

它应该可以工作,我只是编码而不进行测试。我解决了你的问题吗?

答案 1 :(得分:0)

我已经添加了另一个文件,以使其更有趣:

$input = [
    "test1.php" => 130313,
    "test2.php" => 130333,
    "test3.php" => 130313,
    "test4.php" => 140393,
    "test5.php" => 130333,
];

这个简单的解决方案首先准备从inode到文件的地图然后&#34; walk&#34;通过输入数组根据inode分区文件:

$inode_map = array_fill_keys(array_values($input), []);
array_walk($input, function ($inode, $file) use (&$inode_map) {
    $inode_map[$inode][] = $file;
});

$inode_map现在包含:

Array
(
    [130313] => Array
        (
            [0] => test1.php
            [1] => test3.php
        )

    [130333] => Array
        (
            [0] => test2.php
            [1] => test5.php
        )

    [140393] => Array
        (
            [0] => test4.php
        )
)

如果要查找重复文件/ inode,可以过滤地图:

$duplicates_only = array_filter($inode_map, function ($files) { 
    return count($files) > 1;
});

foreach ($duplicates_only as $inode => $files) {
    echo "The following files are the same ($inode): " . join(", ", $files) . PHP_EOL;
}

答案 2 :(得分:-1)

试试这个!

foreach ($arr as $file1=>$value1){
    foreach ($arr as $file2=>$value2){
        if($file1!=$file2  && $value1==$value2){
            echo "<p>The following files are the same: $file1 =>$value1, $file2=>$value2 </p>";
        }
    }    
}