从数组中删除无效数字(太大,太小)

时间:2012-03-19 17:16:06

标签: php arrays algorithm

我有一系列数字,有些数字显然相对于它们而言太大或太小。我想知道是否已经有一些函数或算法可以用来从数组中删除这些记录。

这是一个数组

的例子
8
7
21
1330829238608
6
7
188
8
25
92433
19
6

目前我所能想到的只是检查数量是否大于1k或小于1k然后不允许它。但是我仍然遇到问题,因为188也不属于这里。

有没有什么好方法可以从这个数组获得大多数接近的数字并产生类似

的东西
8
7
6
7
8
6

这是我到目前为止所拥有的

<?php

echo '<pre>';
$startArray = Array(8, 7, 21, 1330829238608, 6, 7, 188, 8, 25, 92433, 19, 6);

print_r($startArray);

for ($i = 0; $i < count($startArray); $i++) {
    if ($i != count($startArray) - 1) {
        if ($startArray[$i] - 10 <= $startArray[$i + 1]) {
            echo $startArray[$i] . '<br />';
        }
    }
}

4 个答案:

答案 0 :(得分:1)

使用array_filter

function filter_callback($var){
    return $var < 100 && $var > 2;
}

$array = array(1,1000,23,4453,123,412,321,433,4,6,2,3,5,634,32,432,45,3,4);

$filtered = array_filter($array, "filter_callback");

答案 1 :(得分:1)

$arrayData = array(8, 7, 21,
                   1330829238608,
                   6, 7, 188, 8, 25,
                   92433,
                   19, 6,
                  );
$min = 7;
$max = 10;

$matches = array_filter( $arrayData,
                         function($data) use ($min,$max) {
                             return (($data >= $min) && ($data <= $max));
                         }
                       );
var_dump($matches);

答案 2 :(得分:0)

我真的要走,但这很容易。

  1. 在数组中创建一个最大=最接近的数字,乘以$ delta。
  2. 数组中任何小于pct最大值的数字。 1,但如果乘以$ delta大于该最大值,则变为最大if($i<$max && $i*$delta>$max) $max = $i*$delta
  3. 删除所有大于当前最大值的数字。
  4. 问题是你需要一个$ delta。与delta一起使用是安全的,但如果你想要它适应性,请不要问我该怎么做,因为这是认知神经科学。

答案 3 :(得分:0)

这可以优化,但这是我想到的,使用20%的差异,当然可以将它改为你想要的任何百分比。

<?php

$startArray = array(8, 7, 21, 1330829238608, 6, 7, 188, 8, 25, 92433, 19, 6);
$groupArray = array();
$startArrayCount = count($startArray);

for ($i = 0; $i < $startArrayCount; $i++) {
    // 20% of current value
    $valueDiff = ($startArray[$i] / 100) * 20;

    // Get minimal and maximal value
    $maxValue = ($startArray[$i] + $valueDiff);
    $minValue = ($startArray[$i] - $valueDiff);

    // Print it out
//    echo 'Diff: ' . $valueDiff . '<br />';
//    echo 'Max: ' . $maxValue . '<br />';
//    echo 'Min: ' . $minValue . '<br />';

    $groupArray[$i] = array();
    for ($n = 0; $n < $startArrayCount; $n++) {
        if ($startArray[$n] <= $maxValue && $startArray[$n] >= $minValue) {
            // echo 'TRUE: ' . $startArray[$n] . '<br />';
            array_push($groupArray[$i], $startArray[$n]);
        }
    }
    //echo '<hr />';
}

// Getting arrays that have most members in it
$max = count($groupArray[0]);
foreach ($groupArray as $group) {
    if (count($group) > $max) {
        $max = count($group);
    }
}

// Taking all those arrays and combining them in one
$finishArray = array();
foreach ($groupArray as $group) {
    if (count($group) == $max) {
        foreach ($group as $key) {
            array_push($finishArray, $key);
        }
    }
}

// Combining all values
$total = null;
foreach ($finishArray as $num) {
    $total = $total + $num;
}

// Getting average
$average = $total / count($finishArray);

echo $average;