3

我有一个这样的数组:

[0] = 2
[1] = 8
[2] = 7
[3] = 7

我想得到一个看起来像这样的数组:

[0] = 7
[1] = 7

基本上,删除它们出现少于两次的所有元素。

他们是可以做到这一点的PHP函数吗?

4

8 回答 8

5

尝试这个,

$ar1=array(2,3,4,7,7);
    $ar2=array();
    foreach (array_count_values($ar1) as $k => $v) {
        if ($v > 1) {
            for($i=0;$i<$v;$i++)
            {
            $ar2[] = $k;
            }
        }
    }
    print_r($ar2);

输出

Array ( [0] => 7 [1] => 7 )

于 2013-05-01T13:05:05.300 回答
2

像这样的东西会起作用,尽管您可以使用 array_reduce 和匿名函数来改进它

<?php

$originalArray = array(2, 8, 7, 7);

foreach (array_count_values($originalArray) as $k => $v) {
    if ($v < 2) {
        $originalKey = array_search($k, $originalArray);
        unset($originalArray[$originalKey]);
    }
}

var_dump(array_values($originalArray));
于 2013-05-01T12:56:03.713 回答
1

您可以使用以下组合array_count_values(这将为您提供一个以值作为键的关联数组,以及它作为值出现的次数),然后是一个简单的循环,如下所示:

$frequency = array_count_values($yourArray);
foreach ($yourArray as $k => $v) {
   if (!empty($frequency[$v]) && $frequency[$v] < 2) {
      unset($yourArray[$k]);
   }
}

我没有测试它,但我认为它开箱即用。请注意,与方法不同,您将循环两次而不是 N^2 次结果array_search。这可以进一步改进,这留给读者作为练习。

于 2013-05-01T12:55:51.447 回答
1
$testData = array(2,8,7,7,5,6,6,6,9,1);

$newArray = array();
array_walk(
    array_filter(
        array_count_values($testData),
        function ($value) {
            return ($value > 1);
        }
    ),
    function($counter, $key) use (&$newArray) {
        $newArray = array_merge($newArray,array_fill(0,$counter,$key));
    }
);

var_dump($newArray);

虽然它会给出严格的标准警告。为避免这种情况,您需要一个临时阶段:

$testData = array(2,8,7,7,5,6,6,6,9,1);

$newArray = array();
$interim = array_filter(
    array_count_values($testData),
    function ($value) {
        return ($value > 1);
    }
);
array_walk(
    $interim,
    function($counter, $key) use (&$newArray) {
        $newArray = array_merge($newArray,array_fill(0,$counter,$key));
    }
);

var_dump($newArray);
于 2013-05-01T13:03:22.260 回答
1

这实际上比我想象的要难......无论如何......

 $input  = array(2, 8, 7, 7, 9, 9, 10, 10);
 $output = array();

 foreach(array_count_values($input) as $key => $value) {
   if ($value > 1) $output = array_merge($output, array_fill(0, $value, $key));
 }
 var_dump($output);  
于 2013-05-01T13:18:22.197 回答
1
$arrMultipleValues = array('2','3','5','7','7','8','2','9','11','4','2','5','6','1');

function array_not_unique($input)    
{
    $duplicatesValues = array();

    foreach ($input as $k => $v)
    {
        if($v>1)
        {
        $arrayIndex=count($duplicatesValues);
        array_push($duplicatesValues,array_fill($arrayIndex, $v, $k));
        }    
    }

    return $duplicatesValues;
}

$countMultipleValue = array_count_values($arrMultipleValues);
print_r(array_not_unique($countMultipleValue));
于 2013-05-02T04:51:59.637 回答
0

他们的 [原文如此!] 是可以做到这一点的 PHP 函数吗?

不,PHP 还没有可以开箱即用的内置函数。

这意味着,如果您正在寻找执行此操作的函数,则它需要位于 PHP 用户空间中。我想在您的问题下引用一条评论,该评论已经建议您在寻找它时如何做到这一点:

array_count_values() 后跟计数 >1 的过滤器后跟 array_fill() 可能有效

马克·贝克 5 分钟前

如果这对你来说听起来有点神秘,他命名的那些函数实际上是 PHP 中的内置函数,所以我认为这最接近否,但答案是:

于 2013-05-01T12:53:33.567 回答
0

这可以完成工作,也许不是最有效的方式。我自己是 PHP 新手 :)

   <?php
$element = array();
$element[0] = 2;
$element[1] = 8;
$element[2] = 7;
$element[3] = 7;

$count = array_count_values($element);
var_dump($element);
var_dump($count);

$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($count));

$result = array();
foreach ($it as $key=>$val){
    if ($val >= 2){
        for($i = 1; $i <= $val; $i++){
            array_push($result,$key);
        }
    }
}
var_dump($result);

?>

编辑: var_dump 只是为了让你可以看到每个阶段发生了什么

于 2013-05-01T13:05:20.173 回答