2012-03-19 3 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

이것은 최적화 할 수 있지만 이것이 내가 알아 낸 것입니다. diff가 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. $ delta를 곱한 배열에서 최대 = 가장 가까운 수를 0으로 만듭니다.
  2. 배열의 모든 숫자가 pct의 최대 값보다 작습니다. 1이지만 $ delta를 곱한 값이 최대 값보다 큰 경우 최대 값이됩니다. if($i<$max && $i*$delta>$max) $max = $i*$delta
  3. 현재 최대 값보다 큰 모든 값을 잘라냅니다.

문제는 $ delta가 필요합니다. 델타에서 2를 사용하는 것이 안전합니다. 그러나 적응력을 원한다면인지 신경 과학이기 때문에 어떻게하는지 묻지 마십시오.

관련 문제