2009-06-03 10 views
8

Me gustaría convertir una cadena en números flotantes. Por ejemploExtraiga números de punto flotante de una cadena en PHP

152.15 x 12.34 x 11mm 

en

152.15, 12.34 and 11 

y almacenar en una matriz tal que $ dim [0] = 152,15, $ dim [1] = 12,34, $ dim [2] = 11.

yo también tenga que manejar las cosas como

152.15x12.34x11 mm 

152.15mmx12.34mm x 11mm 

Gracias.

Respuesta

18
$str = '152.15 x 12.34 x 11mm'; 
preg_match_all('!\d+(?:\.\d+)?!', $str, $matches); 
$floats = array_map('floatval', $matches[0]); 
print_r($floats); 

La construcción de expresión regular (?:...) es lo que se llama un non-capturing group. Lo que eso significa es que el fragmento no se devuelve por separado en parte de la matriz $mathces. Esto no es estrictamente necesario en este caso pero es una construcción útil para saber.

Nota: llamando floatval() en los elementos no es estrictamente necesario, ya sea como PHP generalmente malabares con los tipos correctamente si se trata de usar en una operación aritmética o similar. Sin embargo, no duele, sobre todo por ser solo un trazador de líneas.

+0

Puede deshacerse de los paréntesis externos, y luego $ matches [0] contendrá las coincidencias. Además, ¿cuál es el propósito de '?:'? – troelskn

+1

Tiene toda la razón sobre los paréntesis externos. Cambió eso. ?: hace que lo que está dentro de esos paréntesis sea un grupo que no captura, lo que significa que no se incluirá por separado en la matriz $ matches en ningún lado, lo que sería si no lo incluyeras. No estrictamente necesario pero más limpio y en ejemplos más complicados puede ser necesario. – cletus

+0

@cletus: Tiene toda la razón en cuanto al paréntesis que no captura, pero hace que la expresión regular sea menos legible. "Recibo" la expresión regular de Paolo mucho más rápido que la tuya. – soulmerge

1
$str = "152.15 x 12.34 x 11mm"; 
$str = str_replace("mm", "", $str); 
$str = explode("x", $str); 
print_r($str); // Array ([0] => 152.15 [1] => 12.34 [2] => 11) 

Probado y funciona en todas las cadenas anteriores.

2
$string = '152.15 x 12.34 x 11mm'; 
preg_match_all('/(\d+(\.\d+)?)/', $string, $matches); 
print_r($matches[0]); // Array ([0] => 152.15 [1] => 12.34 [2] => 11) 
4
<?php 

$s = "152.15 x 12.34 x 11mm"; 

if (preg_match_all('/\d+(\.\d+)?/', $s, $matches)) { 
    $dim = $matches[0]; 
} 

print_r($dim); 

?> 

da

Array 
(
    [0] => 152.15 
    [1] => 12.34 
    [2] => 11 
) 
+0

¿Por qué no $ dim = $ coincidencias [0]? – soulmerge

+0

eso es cierto ... corregido. al principio estaba imprimiendo cada valor. if $ dim ya tiene algunos valores, o bien usamos un loop o array_merge() –

+0

Bueno, +1 para mí –

0
preg_match_all("/\d*\.?\d+|\d+/", "152.15mmx12.34mm x .11mm", $matches); 

Este ejemplo apoya números como 0,11 así, ya que son números válidos. $matches[0] contendrá 152.15, 12.34 y 0,11, teniendo en cuenta que se escribe emitir el resultado de flotar. Si no lo hace, 0.11 aparecerá como .11. Escribiría el reparto usando array_map.

$values = array_map("floatval", $matches[0]); 

Puede usar los valores para cualquier cosa matemática sin tipo fundirlos. El moldeado solo es necesario cuando se imprimen directamente.

+0

Su ejemplo sería más claro si utilizó los datos de muestra de la pregunta. –

+0

Esto debería hacerlo más claro. – runfalk

Cuestiones relacionadas