2016-02-07 2 views
0

Я сейчас зациклился на том, как отображать ключи, которые содержат одно и то же значение.Как отображать ключи, которые содержат одно и то же значение?

У меня есть массив с ключами и значениями, я использую оператор 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

Возможно, вы имели в виду test1 и test3 - то же самое? – Michael

+0

Да, они одинаковые –

+0

Я не уверен, есть ли функции прямого массива, чтобы делать то, что вы хотите. Вам просто нужно разработать простую логику для этого. – CodeTweetie

ответ

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"; 
} 

Он должен работать, я просто закодировал его без тестирования. Я решил Вашу проблему?

0

Я добавил еще один файл, чтобы сделать его более интересным:

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

Это простое решение первым готовит карту от дескрипторы к файлам, то «идет» через входной массив для разделения файлов в соответствии с инодом:

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

Если вы хотите найти дубликаты файлов/инодов, вы можете отфильтровать карту:

$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; 
} 
+0

Вы можете заменить 'array_walk'' foreach', если вы предпочитаете этот синтаксис – Michael

-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>"; 
     } 
    }  
} 
+0

Если три файла одинаковы, это решение будет отображать три строки с двумя файлами в каждом. Смешение – Michael

Смежные вопросы