我有一个这样的数组:
[0] = 2
[1] = 8
[2] = 7
[3] = 7
我想得到一个看起来像这样的数组:
[0] = 7
[1] = 7
基本上,删除它们出现少于两次的所有元素。
他们是可以做到这一点的PHP函数吗?
尝试这个,
$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 )
像这样的东西会起作用,尽管您可以使用 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));
您可以使用以下组合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
。这可以进一步改进,这留给读者作为练习。
$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);
这实际上比我想象的要难......无论如何......
$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);
$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));
他们的 [原文如此!] 是可以做到这一点的 PHP 函数吗?
不,PHP 还没有可以开箱即用的内置函数。
这意味着,如果您正在寻找执行此操作的函数,则它需要位于 PHP 用户空间中。我想在您的问题下引用一条评论,该评论已经建议您在寻找它时如何做到这一点:
array_count_values() 后跟计数 >1 的过滤器后跟 array_fill() 可能有效
如果这对你来说听起来有点神秘,他命名的那些函数实际上是 PHP 中的内置函数,所以我认为这最接近否,但答案是:
这可以完成工作,也许不是最有效的方式。我自己是 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 只是为了让你可以看到每个阶段发生了什么