我目前只是想弄清楚如何显示包含相同值的键。
我有一个包含键和值的数组,我使用了一个语句
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
?
答案 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>";
}
}
}