Получить только те значения массива, которые повторяются N раз в PHP - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь получить те значения из массива, которые повторяются N раз в массиве. Я знаю, это звучит странно. Позвольте мне привести пример:

У меня есть массив как $ filter:

array[
  0 => "556878",
  1 => "12345",
  2 => "12345",
  3 => "234567",
  4 => "45673",
  5 => "45673"
]

Если вы видите, что 12345 повторяется 2 раза . То же самое и в случае 45673 .

Я хочу создать функцию или, если она уже существует в PHP, которая помогает мне получать только те значения, которые повторяются N раз. Как и в приведенном выше примере, значения 12345 и 45673 повторяются 2 раза. Так что, если я даю 2 в качестве параметра для функции вроде:

getNtimes($filter,2)

Это вернется:

array[
      0 => "12345",
      1 => "45673"
    ]

Я ищу наиболее эффективный способ добиться желаемого результата. Может ли кто-нибудь помочь мне с этим, пожалуйста?

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 22 мая 2019

Используйте array_count_values() с foreach() внутри функции: -

function getNtimes($array,$count){
    $finalArray = [];

    $repeatedValuesCountArray = array_count_values($array);
    foreach($repeatedValuesCountArray as $key=>$value){
        if($value == $count){
            $finalArray[] = $key;
        }
    }
    return $finalArray;
}


print_r(getNtimes($array,2));

Выход: - https://3v4l.org/g846e

2 голосов
/ 22 мая 2019

Как ответили другие, начните с array_count_values.
Затем я использую array_intersect, чтобы получить значения, соответствующие $n.
Наконец, поскольку «значения» являются ключами, я использую array_keys, чтобы получить дублированные значения из исходного массива.

$n = 2;
$result = array_keys(array_intersect(array_count_values($arr), [$n]));

var_dump($result);

Выход:

array(2) {
  [0]=>
  int(12345)
  [1]=>
  int(45673)
}

https://3v4l.org/BIgCD

2 голосов
/ 22 мая 2019

Вот ваша функция, использующая array_filter,

function getNtimes($arr, $n)
{
    $temp = array_count_values($arr);
    // filter with count and then get those keys.
    return array_keys(array_filter($temp, function ($value) use (&$n) {
        return $value == $n;
    }));
}

array_keys - вернуть все ключи или подмножество ключей массива
array_count_values ​​ - подсчитывает все значения массива
array_filter - Фильтрует элементы массива с помощью функции обратного вызова

работает демо .

0 голосов
/ 22 мая 2019

Вы можете использовать array_filter с array_count_values

$arr = [
  0 => "556878",
  1 => "12345",
  2 => "12345",
  3 => "234567",
  4 => "45673",
  5 => "45673"
];
$N = 2;
$final_result = array_filter(array_count_values($arr), function($v) use($N){
  return  $v==$N;
});
print_r($final_result);

Выход:

Array
(
 [12345] => 2
 [45673] => 2
)

Живой пример

0 голосов
/ 22 мая 2019

Используйте array_unique () + array_filter () + array_count_values ​​():

print_r
  (
    array_unique(
      array_filter($arr = [
                            0 => 556878,
                            1 => 12345,
                            2 => 12345,
                            3 => 234567,
                            4 => 45673,
                            5 => 45673,
                          ], 
                    function ($v) use($arr) {
                      return array_count_values($arr)[$v] == 2;
                    }
                  )
    )
  );

Если вам нужно переиндексировать элементы с 0 - примените array_values ​​() к array_unique () result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...