сравнивать одинаковые значения массива - PullRequest
3 голосов
/ 19 декабря 2010

Каков наилучший способ сравнения элементов в одном и том же массиве в PHP, так что если в массиве A есть два элемента с одинаковыми значениями, я могу передать функцию в качестве аргумента для выполнения чего-либо?

Ответы [ 4 ]

5 голосов
/ 19 декабря 2010

Вы можете использовать функции array_count_values и in_array как:

if(in_array(2,array_count_values($array)) {
  // do something
}
2 голосов
/ 19 декабря 2010

Если вы хотите найти все значения, которые дублируются в массиве, вы можете сделать что-то вроде этого:

// Array to search:
$array = array('one', 'two', 'three', 'one');
// Array to search:
// $array = array('a'=>'one', 'b'=>'two', 'c'=>'three', 'd'=>'one');
// Temp array so we don't find the same key multipule times:
$temp = array();
// Iterate through the array:
foreach ($array as $key)
{
    // Check the key hasn't already been found:
    if (!in_array($key, $temp))
    {
        // Get an array of all the positions of the key:
        $keys = array_keys($array, $key);
        // Check if there is more than one position:
        if (count($keys)>1)
        {
            // Add the key to the temp array so its not found again:
            $temp[] = $key;
            // Do something...
            echo 'Found: "'.$key.'" '.count($keys).' times at position: ';
            for($a=0;$a<count($keys);$a++)
            {
                echo $keys[$a].','; 
            }                   
        }
    }
}

Вывод из вышеизложенного будет:

Найдено: «один» 2 раза в позициях: 0,3

Если бы в вашем массиве были пользовательские ключи (как в массиве с комментариями) , то результат будет:

Найдено: «один» 2 раза в позициях: a, d,

1 голос
/ 19 декабря 2010

Используйте array_udiff или подобное (со ссылочными аргументами в обратном вызове, если вы хотите иметь возможность изменять значения):

$array1 = array('foo', 'bar', 'baz');
$array2 = array('foo', 'baz');

$result = array_udiff($array1, $array2, function(&$a, &$b) {
     if ($a == $b) {
         $a = $b = 'same!';
         return 0;
     }
     return $a > $b ? 1 : -1;
});

print_r($array1); // array('same!', 'bar', 'same!')
print_r($array2); // array('same!', 'same!')
1 голос
/ 19 декабря 2010

Полагаю, вы не хотите сливаться с массивом, а затем удалять дубликаты.

$array1 = array('a', 'b', 'c');
$array2 = array(1, 2, 3, 'a');

// array_merge() merges the arrays and array_unique() remove duplicates
var_dump(array_unique(array_merge($array1, $array2)));

// output: array('a', 'b', 'c', 1, 2, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...