Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][solved]Zaokrąglanie do najbliższej wartości z tablicy
Forum PHP.pl > Forum > PHP
Virti
Witam,

Mam sobie tablicę wartości, np taką: {1.0; 1.1; 1.2; 1.3; 1.5; 1.8; 2.0; 2.7} i mam taki problem

Mając wartość np. 1.875 chciałbym przypasować to do najbliższej innej, czyli 1.8. Do tego round() właśnie służy. Jednak problem jest tego typu:
1. Widać , że między np. 2.0 a 2.7 jest spora luka, jak sprawić, żeby wybierało pomiędzy tymi własnie liczbami, a nie np. 2.5 czy 2.4?
2. Możliwe również, że wartość będzie 18.75 bądź 0.1875, a wszystkie z nich muszą być przypasowane to liczby 1,8 z tablicy. Ma ktoś pomysł jak to rozwiązać?

Z góry dzięki za odpowiedź.

Pozdrawiam,

Virti



EDIT:

Ok, udało mi się to zrobić, trochę naokoło, ale działa i to się liczy winksmiley.jpg [w fazie testów jeszcze, ale wygląda na to, że lata], oto kod:

  1. <?php
  2. function e24($v)
  3. {
  4.    $e24 = array(10, 11, 12, 13, 15, 16, 18, 20, 22, 24, 27, 30, 33, 36, 39, 43, 47, 51, 56, 62, 68, 75, 82, 91);
  5.    
  6.    $i = 1;
  7.    while($v < 10)
  8.    {
  9.        $v = $v*10;
  10.        $i++;
  11.    }
  12.    
  13.    $z = 1;
  14.    while($v > 100)
  15.    {
  16.        $v = $v/10;
  17.        $z++;
  18.    }
  19.    
  20.    foreach($e24 as $key => $value)
  21.    {
  22.        $a[$key] = (int)abs($value - $v);
  23.    }
  24.    
  25.    foreach($a as $key => $value)
  26.    {
  27.        if($value == min($a))
  28.        {
  29.            $v = $e24[$key];
  30.        }
  31.    }
  32.    
  33.    while($i!=1)
  34.    {
  35.        $v = $v/10;
  36.        $i--;
  37.    }
  38.    
  39.    while($z!=1)
  40.    {
  41.        $v = $v*10;
  42.        $z--;
  43.    }
  44.    
  45.    return $v;
  46. }
  47. ?>
zegarek84
to co napisałes wygląda na metodę jakby kolejnych przybliżeń...

w php jestem newbi i może dało sie zrobic to prościej - nie wiem... ale mam nawyki z forum excelai mam nadzieje że nie sa one złe ;p



kożystając ze zmiennych globalnych kod byłby znacznie krótszy  winksmiley.jpg - wystarczyło zdefiniować zmienną $li a puxniej zamiast używać klasy $szukamy->liczba() to po prostu tej zmiennej - no oczywiście wewnątrz funkcji minim($n) trzeba  by było zdefiniować GLOBAL $li....

Kod
class szuk {function liczba(){$li=1.875; return $li;}};
$szukamy = new szuk;
   function minim($n)
     {$szukamy = new szuk;
        return abs($n-$szukamy->liczba());
      };
$s=array(1.0, 1.1, 1.2, 1.3, 1.5, 1.8, 2.0, 2.7);
$b = array_map("minim", $s);
echo in_array($szukamy->liczba()-min($b), $s)?$szukamy->liczba()-min($b):$szukamy->liczba()+min($b);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.