当前位置:  开发笔记 > 编程语言 > 正文

在PHP中将字符串转换为整数的最快方法

如何解决《在PHP中将字符串转换为整数的最快方法》经验,为你挑选了6个好方法。

使用PHP,将这样的字符串转换为"123"整数的最快方法是什么?

为什么这种特殊方法最快?如果它获得意外输入会发生什么,例如"hello"数组?



1> nickf..:

我刚刚建立了一个快速的基准测试练习:

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()的速度慢了2.5倍,如果输入已经是整数,则差异最大.

我有兴趣知道为什么.


更新:我再次运行测试,这次是强制 (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进行测试


通过使用php的鲜为人知的一元加运算符,可以进一步简化您的强制示例.$ x + 0 - > + $ x
它可能与intval()调用函数调用这一事实有关,而直接在解释器的表达式计算器中处理转换.这也可能是合作更快的原因.

2> Rexxars..:

我个人觉得演员是最漂亮的.

$iSomeVar = (int) $sSomeOtherVar;

如果发送一个像'Hello'这样的字符串,它将被转换为整数0.对于一个字符串,如'22岁',它将被强制转换为整数22.任何它无法解析为数字的东西都变为0.

如果你真的需要速度,我想这里的其他建议是正确的,假设强制是最快的.


有趣的是,数组被转换成1.数字.
@nickf不是这样 - 它也可以转换为0.它将boolean(true | false)值转换为整数 - 'false'= 0,'true'= 1.如果数组100%为空,则数组为false,如果它包含任何数据,则为真,即使它只是空的字符串或NULL值.如果你要将一个空数组转换为一个整数,它将变为0.(是的,我知道这个旧的!)

3> staticsan..:

运行测试.

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

这是一个测试,每个场景运行10,000,000次.:-)

合作是 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";
        }
    }
}



4> Nishchit Dha..:

您可以使用FLOAT将长字符串简单地转换为整数

$float = (float)$num;

或者,如果你想要整数而不是浮动val,那就去吧

$float = (int)$num;

对于前者

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



5> Elric Wamugu..:
$int = settype("100", "integer"); //convert the numeric string to int


我相信一些参考或证明是有序的!

6> Developer..:

整数从任何字符串中删除

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

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

// $ out ='1231233';

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有