2016-05-02 2 views
-4

I wie einen PHP-Array unterden Minimalwertes in der Gruppe von float mit PHP Set

array [0 => 1.0, 1 => 1.5, 2 => 3.0, 3 => 5.0, 4 => 7.5, 5 => 10.0, 6 => 20.0, 7 => 30.0, 8 => 50.0, 9 => 100.0] 

I einen Wert berechnet, wie '6'. was ich tun möchte, ist der nächste Wert meiner Tabelle finden (das 5 in diesem Fall wäre) und eine neue Anordnung, die 5 für min Wert haben, der diese

array [0 => 5.0, 1 => 7.5, 2 => 10.0, 3 => 20.0, 4 => 30.0, 5 => 50.0, 6 => 100.0] 

Ist das möglich wäre, dies zu tun ?

+0

ist Ihr Array immer sortiert? – splash58

+0

Ja, es ist ein Array von Wert aus der Datenbank – stax

+0

Scheint ziemlich einfach, erstellen Sie eine Funktion, um das Array zu iterieren, wenn value ist> = der Vergleich val fügen Sie es zu einem neuen Array dann das Array zurückgeben ... – Wobbles

Antwort

1

dieses Versuchen wieder aufbauen:

<?php 
    $arr = [0 => 1.0, 1 => 1.5, 2 => 3.0, 3 => 5.0, 4 => 7.5, 5 => 10.0, 6 => 20.0, 7 => 30.0, 8 => 50.0, 9 => 100.0]; 

    var_dump(getNearestSequence($arr, 6)); 

    function getNearestSequence($arr, $cue){ 
     $nextArray = $arr; 
     $arrOffsets = array(); 

     foreach($arr as $iKey=>$fVal){ 
      $arrOffsets[] = abs(doubleval($fVal - doubleval($cue))) . ""; 
     } 

     $minVal  = min($arrOffsets); 
     $arrOffFlip = array_flip($arrOffsets); 
     $key  = $arrOffFlip[$minVal]; 
     array_splice($nextArray, 0, $key); 
     return $nextArray; 
    } 

    // SINCE 5 IS CLOSEST TO 6 ON THE SEQUENCE; THIS DUMPS: 
     array (size=7) 
      0 => float 5 
      1 => float 7.5 
      2 => float 10 
      3 => float 20 
      4 => float 30 
      5 => float 50 
      6 => float 100 
+0

verschoben wurden, es funktioniert sehr gut. Ich habe eine Menge Dinge zu lernen ... – stax

+0

was würdest du tun, wenn ich den nächsten Wert bekommen muss? das wäre in diesem Fall 7,5. – stax

+0

Alles, was Sie tun müssen, ist den Wert des zweiten Arguments zu ändern, um Ihren Wunsch zu reflektieren. Also zum Beispiel, wenn Sie etwas neben 7 bekommen wollen, versuchen Sie dies: *** var_dump (getNearestSequence ($ arr, 7)); *** Beachten Sie die *** 7 *** hier. Sie müssen diese Nummer nur ändern, um Ihren Anforderungen zu entsprechen ... – Poiz

1

Dies hängt von Ihrer Definition von am nächsten, aber hier ist eine mögliche Lösung (vorausgesetzt, die am nächsten bedeutet, die am wenigsten mathematische Differenz zwischen den Zahlen):

<?php 
$number = 6; // this is your pre-determined number 
foreach ($array as $value) { 
    if (isset($temp)) { 
     if (abs($number - $value) <= abs($number - $temp)) { 
      $temp = $value; 
     } 
    } else { 
     $temp = $value; 
    } 
} 
foreach ($array as $value) { 
    if ($value >= $temp) { 
     $result[] = $value; 
    } 
} 
?> 

EDIT: Diese wurden unter der Annahme geschrieben, dass Ihre ersten Das Array wird nicht unbedingt sortiert und die Schlüssel müssen nicht unbedingt fortlaufend sein.

1

Verwendung array_slice das Array

$array =[1.0, 1.5, 3.0, 5.0, 7.5, 10.0, 20.0, 30.0, 50.0, 100.0]; 

$find = 6; 
// init valuse with the 1st array item 
$pos = 0; 
$min = abs($array[0]-$find); 
for($i = 1; $i < count($array); $i++) { 
    // because array is sorted we can stop iteration 
    // when abs($array[$i]-$find) begin increase 
    if(abs($array[$i]-$find) > $min) break; 
    // else save position and value 
    else { $min = abs($array[$i]-$find); $pos = $i; } 
} 

echo "Closest value : ". $array[$pos] . "\n"; 
$result = array_slice($array, $pos); 

demo