[英]PHP string with int or float to number
如果我在數組中有兩個字符串:
$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)); }
這行得通,但只是一團糟。
<?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);
OUTPUT
Array
(
[0] => 100
[1] => 2.1
)
最簡單的方法就是根據需要創建數組,而不是
$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個單獨的組確定類型和值:
([az]+)\\((\\d*\\.?\\d*)\\)
regex會捕獲直到第一個(
。)的字母數字字符,然后使用(
\\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"
}
}
然后,您可以使用檢查來執行轉換,例如:
$value;
if(matches[1] === "int") {
$value = intval($matches[2]);
} elseif (matches[1] === "float") {
$value = floatval($matches[2]);
}
后面的代碼仍然需要錯誤處理,但是您明白了。 希望這可以幫助!
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(如果有)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.