Если у меня есть две строки в массиве:

$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)); }

Это работает, но это просто грязно.

php
0
RGriffiths 20 Авг 2018 в 22:46

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
)
3
vivek_23 20 Авг 2018 в 20:08

Простейшим было бы просто сделать массив так, как вам нужно, поэтому вместо

$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 } } .

0
Marcin Orlowski 20 Авг 2018 в 20:00

Я бы сделал это с помощью регулярного выражения для определения типа и значения по 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]);
}

Последний код все еще нуждается в обработке ошибок, но вы поняли идею. Надеюсь это поможет!

0
Patrick2607 20 Авг 2018 в 20:10

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 (если есть).

0
hakre 20 Авг 2018 в 21:20
51937580