如果我在数组中有两个字符串:
$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)); }
这行得通,但只是一团糟。
答案 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
,.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"
}
}
后面的代码仍然需要错误处理,但是您明白了。希望这会有所帮助!
答案 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(如果有)。