PHP字符串,整数或浮点数为数字

时间:2018-08-20 19:46:17

标签: php

如果我在数组中有两个字符串:

$x = array("int(100)", "float(2.1)");

是否有一种简单的方法来读取每个值,并将它们作为数字存储在内部?

原因是我正在查看一个函数(不是我的),该函数有时会接收一个int值,有时会接收一个float值。我无法控制它收到的数据。

function convertAlpha($AlphaValue) { 
    return((127/100)*(100-$AlphaValue));
}

它会导致php错误

  

PHP注意:遇到格式不正确的数值

我想摆脱的

我可以将字符串剥离下来,看看它是什么,然后进行intval / floatval,但想知道是否有一种整齐的方法。

更新:

我玩了一点:

函数convertAlpha($ AlphaValue)     {

$x = explode("(", $AlphaValue);
$y = explode(")", $x[1]);

if ($x[0] == "int") {
    $z = intval($y[0]);
}

if ($x[0] == "float") {
    $z = floatval($y[0]);
}

return((127/100)*(100-$z)); }

这行得通,但只是一团糟。

4 个答案:

答案 0 :(得分:3)

<?php

$x = array("int(100)", "float(2.1)");

$result = [];

foreach($x as $each_value){
    $matches = [];
    if(preg_match('/^([a-z]+)(\((\d+(\.\d+)?)\))$/',$each_value,$matches)){
        switch($matches[1]){
          case "int": $result[] = intval($matches[3]); break;
          case "float": $result[] = floatval($matches[3]);
        }
    }
}

print_r($result);

输出

Array
(
    [0] => 100
    [1] => 2.1
)

答案 1 :(得分:0)

最简单的方法就是根据需要创建数组,而不是

$x = array("int(100)", "float(2.1)");

您有:

$x = [100, 2.1];

但是因为这不是您想要的,所以您现在有两种选择。一种是使用eval(),例如:

$x = ['(int)100', '(float)2.1'];
foreach ($x as $v) {
    var_dump(eval("return ${v};"));
}

将产生:

int(100)
double(2.1)

您注意到,源数组有些不同,因为在PHP中没有int()float()这样的函数,因此,如果您决定使用eval(),则需要更改字符串,以使其成为有效的PHP代码,如上面的示例所示,或者使用现有的intval()floatval()函数。最后,您可以自己解析字符串(最有可能使用preg_match()),检查自己的语法,然后将其转换为PHP eval()或仅以自己的代码进行处理,通常建议使用eval()

答案 2 :(得分:0)

我要做的方式是使用正则表达式按2个单独的组确定类型和值:

([a-z]+)\((\d*\.?\d*)\)

正则表达式最多捕获字母数字字符,直到第一个(。然后使用以下部分在()之间寻找字符。

正则表达式的数字部分接受类似\d*\.?\d*12.34.1212.的输入

123

这将导致下面的输出。如您所见,数组的$re = '/([a-z]+)\((\d*\.?\d*)\)/m'; $input_values = array('int(100)', 'float(2.1)'); foreach($input_values as $input) { preg_match_all($re, $input, $matches, PREG_SET_ORDER, 0); var_dump($matches); } 插槽中有类型,[1]插槽中有数字

[2]

然后您可以使用支票执行转换,例如:

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(8) "int(100)"
    [1]=>
    string(3) "int"
    [2]=>
    string(3) "100"
  }
}
array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(10) "float(2.1)"
    [1]=>
    string(5) "float"
    [2]=>
    string(3) "2.1"
  }
}

后面的代码仍然需要错误处理,但是您明白了。希望这会有所帮助!

答案 3 :(得分:0)

PHP在历史上是针对字符串键入的,因此在此类情况下它相当强大。

$x = array("int(100)", "float(2.1)");
                ^^^           ^^^

实际上,您可以通过将第一个“ (”之后的子字符串乘以一个以将其转换为数字来将其转换为数字-整数或浮点数:

$numbers = array_map(function($string) {
    return 1 * substr(strstr($string, '('), 1);
}, $x);

var_dump($numbers);

array(2) {
  [0] =>
  int(100)
  [1] =>
  double(2.1)
}

这是PHP从字符串中获取所有数字,直到该字符串似乎结束为止,并将其计算为整数或浮点数(var_dump()显示float为double)。它只是消耗了字符串开头的所有数字部分。

并不是说现有的答案本身就是错误的,但是如果您将其作为一个PHP问题问,PHP对此具有很好的解析器。我的建议是从字符串的开头删除多余的信息,然后让PHP做其余的事情。

如果您想要更精确的话,正则表达式很可能是您的朋友,因为在最高评分的答案中,仍与PHP结合使用可以对每个字符串进行全面检查:

$numbers = array_map(function($string) {
    $result = preg_match('~^(?:int|float)\(([^)]+)\)$~', $string, $group) ? $group[1] : null;
    return null === $result ? $result : 1 * $result;
}, $x);

因此所有非int和float字符串都将变成NULL(如果有)。