如果一个数组中有两个字符串:
$x = array("int(100)", "float(2.1)");
有没有一种简单的方法将每个值读取为存储在内部的数字?
原因是我正在查看一个函数(不是我的),它有时接收int,有时接收浮点数。我无法控制它接收的数据。
function convertAlpha($AlphaValue) {
return((127/100)*(100-$AlphaValue));
}
它会在php中导致错误。
PHP通知:遇到格式不正确的数值
我想摆脱它。
我可以剥离这根线,看看它是什么,然后做一个整形/浮动,但我想知道是否有一个整洁的方法。
更新:
玩了一下,我有这样的想法:
函数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)); }
这是有效的,但它只是混乱。
发布于 2018-08-21 04:08:14
<?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
)
发布于 2018-08-21 03:57:27
最简单的方法就是在需要的时候创建数组,而不是
$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()
,你需要通过上面例子中所示的强制转换,或者使用现有的intval()
或floatval()
函数,将字符串更改为有效的PHP代码。最后,您可以自己解析字符串(很可能使用preg_match()
),检查自己的语法并转换为eval()
,或者在您自己的代码中处理它,这通常比使用eval()
更推荐。
发布于 2018-08-21 04:10:15
我的方法是使用正则表达式来确定两个单独的组的类型和值:
([a-z]+)\((\d*\.?\d*)\)
正则表达式捕获直到第一个(
为止的字母数字字符。然后,它使用以下部分查找(
和)
之间的字符:\d*\.?\d*
。
正则表达式的digit部分接受如下输入:12.34
、.12
、12.
和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"
}
}
然后,您可以使用检查来执行转换,如下所示:
$value;
if(matches[1] === "int") {
$value = intval($matches[2]);
} elseif (matches[1] === "float") {
$value = floatval($matches[2]);
}
后面的代码仍然需要错误处理,但是您已经明白了。希望这能有所帮助!
https://stackoverflow.com/questions/51937580
复制相似问题