2013-03-12 6 views
5

Mam tablicę wartości mieszanych:PHP: Jeśli liczba (z przecinkiem), konwertować je do odpowiedniego formatu liczb (z punktu)

$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54'); -1,94 -1,55 

Jak widać to zawiera tekst i zarówno negatywne i pozytywne przecinek -liczby.

Konieczne jest przekonwertowanie wartości liczbowych na format liczb prawidłowych i pozostawienie bez zmian wartości tekstowych.

Teraz jestem zapętlenie nad wartościami:

foreach ($row as $value) { 
    // If $value is numeric, convert it to the 
    // right number format for use with MySQL (decimal(10,2)) 
    // If not, leave it be. 
} 

dwóch powiązanych pytań mam badane, ale nie może znaleźć odpowiedniego rozwiązania.

ktoś może stanowić praktyczny przykład?

Odpowiedz

6

Nie musisz używać wyrażeń regularnych.

użycie str_replace() jak trzeba wymienić ',' dla '.', a następnie użyj intval() lub floatval() funkcje, aby uzyskać wartość liczbową. Można również użyć strstr() szukać '.' i zdecydować, czy przy użyciu intval() lub floatval()

Przykład:

$row = array('Unspecified risk', 'Yes', '8', '3', '2', '13', 'none', '-1,49', '-2,51', '-1,46', '-1,54'); 

    function toNumber($target){ 
     $switched = str_replace(',', '.', $target); 
     if(is_numeric($target)){ 
      return intval($target); 
     }elseif(is_numeric($switched)){ 
      return floatval($switched); 
     } else { 
      return $target; 
     } 
    } 

    $row = array_map('toNumber', $row); 

    var_dump($row); 

Używamy str_replace(), aby zastąpić kropkę na przecinek, w ten sposób, że jest to międzynarodowa notacja pływak , nawet jeśli jest na sznurku, w ten sposób później możemy sprawdzić, czy jest on numeryczny z is_numeric() < - ta funkcja jest niesamowita, ponieważ wykrywa z ciągu, jeśli jest liczbą lub nie, bez względu na liczbę całkowitą lub zmienną itp.

Używamy is_n umeric, aby sprawdzić, czy wartość jest liczbą całkowitą zmiennoprzecinkową lub tekstową i zwrócić odpowiednią wartość za pomocą intval() lub floatval() (wartość bez zastosowanej zamiany nie zwróci jako poprawnej wartości liczbowej, tylko po przełączeniu, i. zwróci true jako numeryczne).

Używamy $row = array_map('toNumber', $row); do zastosowania zmian w tablicy.

Zysk xD

+0

Dzięki za odpowiedzi. Ale jak odróżnić wartości tekstowe od liczb? – maartenmachiels

+0

z is_numeric(), sprawdź moją edycję: D – aleation

+0

Bardzo eleganckie rozwiązanie! Dziękuję za twoje wysiłki: działa jak urok. – maartenmachiels

1
$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54'); 
    foreach($row as $key => $var) { 
     if(strstr($var, ",") && !is_numeric($var)) { 
      $var1 = str_replace(",","", $var); 
      if(is_numeric($var1)) { 
       $decimal = strstr($var, ',', TRUE); 
       $digits = str_replace($decimal, "", $var1); 
       $finalValue = $digits * pow(10,$decimal); 
       $row[$key] = $finalValue; 
      } 
     } 
    } 
    echo "<pre>"; print_r($row); 

UWAGA: To będzie pracować dla PHP 5.3 lub PHP 5.3+

+1

Checkout floatval() w dokumentacji php, jeśli użyjesz floatval ($ var1) po str_replace() otrzymasz wartość bezpośrednio.Nie musisz wykonywać następujących 4 operacji. – aleation

+1

Dzięki za odpowiedź! – maartenmachiels

0

Korzystanie is_numeric przetestowania i number_format formatować

foreach ($row as &$value) { 
    $number = str_replace(',','.'); 
    if(is_numeric($number)) 
     $value = number_format($number, 2, '.', ''); 
} 
unset($value);