2008-10-27 2 views
240

Использование PHP, какой самый быстрый способ преобразовать такую ​​строку: "123" в целое число?Самый быстрый способ преобразования строки в целое число в PHP

Почему именно этот метод является самым быстрым? Что произойдет, если он получит неожиданный ввод, например "hello" или массив?

+1

счет: это не домашнее задание - мне на самом деле просто любопытно. :) – nickf 2008-10-27 05:22:47

+0

Почему «самый быстрый» имеет значение? – 2008-12-02 05:37:09

+12

хорошо, если это не повредит (читаемость), почему бы не сделать что-либо самым эффективным способом? – nickf 2008-12-02 13:40:36

ответ

364

Я просто настроить быстрый бенчмаркинга упражнение:

Function    time to run 1 million iterations 
-------------------------------------------- 
(int) "123":    0.55029 
intval("123"):    1.0115 (183%) 

(int) "0":     0.42461 
intval("0"):    0.95683 (225%) 

(int) int:     0.1502 
intval(int):    0.65716 (438%) 

(int) array("a", "b"):  0.91264 
intval(array("a", "b")): 1.47681 (162%) 

(int) "hello":    0.42208 
intval("hello"):   0.93678 (222%) 

В среднем, призывающую intval() является два с половиной раза медленнее, а разница является наибольшей, если ваш вклад уже целое ,

Мне было бы интересно знать почему.


Обновление: Я запускать тесты снова, на этот раз с принуждением (0 + $var)

| INPUT ($x)  | (int) $x |intval($x) | 0 + $x | 
|-----------------|------------|-----------|-----------| 
| "123"   | 0.51541 | 0.96924 | 0.33828 | 
| "0"    | 0.42723 | 0.97418 | 0.31353 | 
| 123    | 0.15011 | 0.61690 | 0.15452 | 
| array("a", "b") | 0.8893 | 1.45109 | err!  | 
| "hello"   | 0.42618 | 0.88803 | 0.1691 | 
|-----------------|------------|-----------|-----------| 

Добавление: Я только что через несколько неожиданное поведение, которое вы должны знать, когда выбрать один из следующих способов:

$x = "11"; 
(int) $x;  // int(11) 
intval($x); // int(11) 
$x + 0;  // int(11) 

$x = "0x11"; 
(int) $x;  // int(0) 
intval($x); // int(0) 
$x + 0;  // int(17) ! 

$x = "011"; 
(int) $x;  // int(11) 
intval($x); // int(11) 
$x + 0;  // int(11) (not 9) 

испытано с использованием PHP 5.3.1

+9

Вероятно, это связано с тем, что intval() вызывает вызов функции, в то время как литье обрабатывается непосредственно в калькуляторе выражения интерпретатора. Это также может быть причиной того, что совместное вмешательство еще быстрее. – staticsan 2008-10-27 06:09:09

+10

Пример вашего принуждения может быть еще более упрощен с помощью малоизвестного операционного оператора php. $ x + 0 -> + $ x – Ozzy 2013-04-02 08:57:33

15

Запустить тест.

string coerce:   7.42296099663 
    string cast:   8.05654597282 
    string fail coerce:  7.14159703255 
    string fail cast:  7.87444186211 

Это испытание, которое выполняло каждый сценарий 10 000 000 раз. :-)

Co-ercion является 0 + "123"

Кастинг (integer)"123"

Я думаю, что Co-ercion это чуть-чуть быстрее. О, и попытка 0 + array('123') является фатальной ошибкой в ​​PHP. Возможно, вы захотите, чтобы ваш код проверял тип поставляемого значения.

Мой тестовый код приведен ниже.


function test_string_coerce($s) { 
    return 0 + $s; 
} 

function test_string_cast($s) { 
    return (integer)$s; 
} 

$iter = 10000000; 

print "-- running each text $iter times.\n"; 

// string co-erce 
$string_coerce = new Timer; 
$string_coerce->Start(); 

print "String Coerce test\n"; 
for($i = 0; $i < $iter ; $i++) { 
    test_string_coerce('123'); 
} 

$string_coerce->Stop(); 

// string cast 
$string_cast = new Timer; 
$string_cast->Start(); 

print "String Cast test\n"; 
for($i = 0; $i < $iter ; $i++) { 
    test_string_cast('123'); 
} 

$string_cast->Stop(); 

// string co-erce fail. 
$string_coerce_fail = new Timer; 
$string_coerce_fail->Start(); 

print "String Coerce fail test\n"; 
for($i = 0; $i < $iter ; $i++) { 
    test_string_coerce('hello'); 
} 

$string_coerce_fail->Stop(); 

// string cast fail 
$string_cast_fail = new Timer; 
$string_cast_fail->Start(); 

print "String Cast fail test\n"; 
for($i = 0; $i < $iter ; $i++) { 
    test_string_cast('hello'); 
} 

$string_cast_fail->Stop(); 

// ----------------- 
print "\n"; 
print "string coerce:   ".$string_coerce->Elapsed()."\n"; 
print "string cast:   ".$string_cast->Elapsed()."\n"; 
print "string fail coerce:  ".$string_coerce_fail->Elapsed()."\n"; 
print "string fail cast:  ".$string_cast_fail->Elapsed()."\n"; 


class Timer { 
    var $ticking = null; 
    var $started_at = false; 
    var $elapsed = 0; 

    function Timer() { 
     $this->ticking = null; 
    } 

    function Start() { 
     $this->ticking = true; 
     $this->started_at = microtime(TRUE); 
    } 

    function Stop() { 
     if($this->ticking) 
      $this->elapsed = microtime(TRUE) - $this->started_at; 
     $this->ticking = false; 
    } 

    function Elapsed() { 
     switch($this->ticking) { 
      case true: return "Still Running"; 
      case false: return $this->elapsed; 
      case null: return "Not Started"; 
     } 
    } 
} 
32

Я лично считаю, литье является симпатичным.

$iSomeVar = (int) $sSomeOtherVar; 

В случае, если строка, как «Hello» будет отправлено, оно будет наложено на целое 0. Для строки, такие как '22 лет», он будет приведен к целому числу 22. Все, что он не может разобрать к числу становится 0.

Если вам действительно нужна скорость, я думаю, что другие предложения здесь правильные, если предположить, что принуждение является самым быстрым.

7
$int = settype("100", "integer"); //convert the numeric string to int 
9

Вы можете просто преобразовать длинную строку в целое число с помощью FLOAT

$float = (float)$num;

Или, если вы хотите, целое число, не плавающий вал затем с

$float = (int)$num;

Для отл.

(int) "1212.3" = 1212 
(float) "1212.3" = 1212.3 
3

Другие результаты тестов Ad-Hoc:

$ time php -r 'for ($x = 0;$x < 999999999; $x++){$i = (integer) "-11";}'  

real 2m10.397s 
user 2m10.220s 
sys  0m0.025s 

$ time php -r 'for ($x = 0;$x < 999999999; $x++){$i += "-11";}'    

real 2m1.724s 
user 2m1.635s 
sys  0m0.009s 

$ time php -r 'for ($x = 0;$x < 999999999; $x++){$i = + "-11";}'    

real 1m21.000s 
user 1m20.964s 
sys  0m0.007s 
7

целое excract из любой строки

$ в = 'tel.123-12-33';

preg_match_all('!\d+!', $in, $matches); 
$out = (int)implode('', $matches[0]); 

// $ out = '1231233';

3

Ран эталона, и оказывается, самым быстрым способом получить реальное целых (с использованием всех доступных методов) является

$foo = (int)+"12.345"; 

Только с помощью

$foo = +"12.345"; 

возвращает поплавок.

Смежные вопросы