Если у меня есть две строки в массиве:
$x = array("int(100)", "float(2.1)");
Есть ли простой способ чтения каждого значения как числа, хранящегося внутри как числа?
Причина в том, что я смотрю на функцию (не мою), которая иногда получает int, а иногда и float. Я не могу контролировать данные, которые он получает.
function convertAlpha($AlphaValue) {
return((127/100)*(100-$AlphaValue));
}
Это вызывает ошибку в php
Примечание PHP: встречается некорректно сформированное числовое значение
От которого я хочу избавиться.
Я мог бы раздеть строку и посмотреть, что это такое, и сделать intval / floatval, но подумал, был ли аккуратный путь.
ОБНОВИТЬ:
Поиграв немного, я имею это:
Function 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 ответа
<?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
)
Простейшим было бы просто сделать массив так, как вам нужно, поэтому вместо
$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()
, либо просто обработать его в своем собственном коде, который обычно рекомендуется использовать { { Х7 } } .
Я бы сделал это с помощью регулярного выражения для определения типа и значения по 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"
}
}
Затем вы можете использовать проверку, чтобы выполнить приведение типа:
$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 () показывает число с плавающей запятой как двойное). Он просто потребляет все числовые части с начала строки.
Не говоря уже о том, что существующие ответы сами по себе неверны, но если вы зададите этот вопрос как вопрос 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 (если есть).
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.