
tianbo
Me gustaría convertir una cadena de valores de dimensión delimitados en números flotantes.
Por ejemplo
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;
También necesitaría manejar escenarios donde el texto delimitador es diferente y los números pueden ir seguidos de una expresión de unidad como:
152.15x12.34x11 mm
152.15mmx12.34mm x 11mm

cleto
$str="152.15 x 12.34 x 11mm";
preg_match_all('!\d+(?:\.\d+)?!', $str, $matches);
$floats = array_map('floatval', $matches[0]);
print_r($floats);
Él (?:...)
la construcción de expresiones regulares es lo que se llama grupo que no captura. Lo que eso significa es que el fragmento no se devuelve por separado en parte del $mathces
formación. Esto no es estrictamente necesario en este caso pero es una construcción útil saber.
Nota: vocación floatval()
sobre los elementos tampoco es estrictamente necesario, ya que PHP generalmente hará malabarismos con los tipos correctamente si intenta usarlos en una operación aritmética o similar. Sin embargo, no duele, particularmente por ser solo una línea.
$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 )

Ólafur Waage
$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 )
Lo probé y funciona en todas las cadenas anteriores.
preg_match_all("/\d*\.?\d+|\d+/", "152.15mmx12.34mm x .11mm", $matches);
Este ejemplo admite números como .11 también, ya que son números válidos. $matches[0]
contendrá 152.15, 12.34 y 0.11, dado que escribe el resultado para flotar. si no lo haces 0.11 aparecerá como .11. Escribiría cast usando array_map
.
$values = array_map("floatval", $matches[0]);
Sin embargo, puede usar los valores para cualquier cosa matemática sin escribirlos. solo se necesita fundición cuando se imprimen directamente.