2012-03-19 9 views
-2

У меня есть массив чисел, и некоторые цифры, очевидно, слишком велики или слишком малы относительно всех. Интересно, есть ли какая-то функция или алгоритм, который я могу использовать для удаления этих записей из массива.Удалите недопустимые числа (слишком большие, слишком маленькие) из массива

Вот пример массива

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

«некоторые цифры, очевидно, слишком большие или слишком маленькие» - как это очевидно? –

+3

Как вы определяете «слишком большой» или «слишком маленький»? – scibuff

+1

Я не могу это получить. Какие числа «слишком велики» и «слишком малы»? это зависит от чисел или всегда есть один и тот же разрешенный интервал (скажем, 1-100) –

ответ

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; 
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"); 
+0

100 и 2 плохо для меня, так как он не адаптируется – sed

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); 
+0

Min/Max плохо для меня, так как он не адаптируется – sed

+1

Возможно, но до тех пор, пока вы не уточните, что вам нужно, нам очень сложно догадаться ... и вы может начать с объяснения того, что означает «адаптируемый» –

0

Мне действительно нужно идти, но это легко.

  1. создать максимальное = ближайшее число до 0 в массиве, умноженное на $ delta.
  2. любое число в массиве, меньшее максимального значения от pct. 1, но если умножить на $ delta больше этого максимума, становится максимально if($i<$max && $i*$delta>$max) $max = $i*$delta
  3. обрезать все числа, превышающие максимальный ток.

Проблема в том, что вам нужна дельта. Безопасно идти с 2 для дельта, но если вы хотите, чтобы он адаптировался, не спрашивайте меня, как это сделать, потому что это когнитивная нейронаука.

Смежные вопросы