我有一个这样的数组:
[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);
输出
数组([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]);
}
}
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);
$output = array_merge($output, array_fill(0, $value, $key));
应该可以完美地工作。 - Mark Bakerarray_fill
中必须明确指定起始索引。 - AlexP$output = $output + array_fill(0, $value, $key);
时,才会出现键冲突。 - Mark Baker$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
$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 只是为了让您在每个阶段看到发生了什么
array_count_values()
(计算数组中所有值出现的次数)array_fill()
(用给定的值填充数组)