【问题标题】:Get only those array values which are repeating N number of times in PHP仅获取在 PHP 中重复 N 次的数组值
【发布时间】:2019-10-08 13:04:22
【问题描述】:

我正在尝试从数组中获取那些在数组中重复 N 次的值。我知道这听起来很混乱。举个例子吧:

我有一个数组作为 $filter:

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

如果您可以看到 12345 重复 2 次​​strong>。 45673 也是如此。

我想创建一个函数,或者如果 PHP 中已经存在,它可以帮助我只获取那些重复 N 次的值。就像上面的例子一样,值 12345 和 45673 重复了 2 次。因此,如果我将 2 作为参数提供给如下函数:

getNtimes($filter,2)

它会回来的:

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

我正在寻找最有效的方法来获得想要的结果。谁能帮我解决这个问题?

提前致谢。

【问题讨论】:

  • 只需运行循环并将值保存在另一个数组中并返回它们:/
  • 我很高兴你选择了我的答案,但即使看起来更长,Alives 的答案也更有效、更快。我的代码做了“三个”循环,他只做了两个。
  • 很奇怪,你的答案对我来说工作得更快:P。无论如何谢谢:)
  • 我可以看到这种情况可能发生在较小的数组上,但是一旦你开始加载这两个函数,我很确定 Alives 的回答会更快。或者您是否一个接一个地在同一个文件中测试它们?这也可以产生影响。

标签: php arrays function arraylist filter


【解决方案1】:

在函数内使用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】:

这是您使用 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 — 使用回调函数过滤数组的元素

工作demo

【讨论】:

  • 结果与 OP 预期的不一样。
  • 是的,结果与我预期的不同。
  • @u_mulder 现在检查。
  • @FaranKhan 您现在可以查看。
【解决方案3】:

正如其他人回答的那样,从 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

【讨论】:

    【解决方案4】:

    使用 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() 结果

    【讨论】:

      【解决方案5】:

      您可以将array_filterarray_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
      )
      

      Live Example

      【讨论】:

        猜你喜欢
        • 2016-05-27
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多