2013-03-12 1 views
5

У меня есть массив смешанных значений:PHP: Если номер (с запятой), преобразовать его в формат нужного количества (с точкой)

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

Как вы можете видеть, что содержит текст и положительную и отрицательную запятую -чисел.

Мне нужно преобразовать числовые значения в нужный формат и оставить текстовые значения как есть.

Теперь я зацикливание над значениями:

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. 
} 

Два взаимосвязанного вопрос я изученный, но не могу найти подходящее решение.

Может ли предоставить практический пример?

ответ

6

Вам не нужно использовать регулярные выражения.

использование str_replace() как вам нужно заменить ',' для '.', а затем использовать intval() или floatval() функции для получения числового значения. Вы также можете использовать strstr() искать '.' и решить, используя intval() или floatval()

Пример:

$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); 

Мы используем str_replace(), чтобы заменить точку на запятую, таким образом, это международное обозначение поплавка , даже если он находится на строке, таким образом позже мы можем проверить, является ли это числовым с is_numeric() < - эта функция является удивительной, поскольку она обнаруживает строку, если она является числом или нет, независимо от целого числа или поплавка и т. д.

Мы используем is_n umeric, чтобы проверить, является ли значение целочисленным float или текстом, и возвращает соответствующее значение с помощью intval() или floatval() (значение без примененной замены не будет возвращено как действительное числовое значение, только после переключения, и. он вернет true как числовой).

Для применения изменений к массиву мы используем $row = array_map('toNumber', $row);.

Profit XD

+0

Спасибо за ответы. Но как я могу различать текстовые значения и числовые значения? – maartenmachiels

+0

с is_numeric(), проверьте мое редактирование: D – aleation

+0

Очень элегантное решение! Спасибо за ваши усилия: он работает как шарм. – 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); 

Примечание: Это будет работать для PHP 5.3 или PHP 5.3+

+1

checkout floatval() в документации php, если вы используете floatval ($ var1) после str_replace(), он получает значение напрямую.Вам не нужно было бы выполнять следующие 4 операции – aleation

+1

Спасибо за ваш ответ! – maartenmachiels

0

Использование is_numeric для тестирования и number_format форматировать

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