如何将数组的值从string转换为int?
$string = "1,2,3" $ids = explode(',', $string); var_dump($ids);
回报
array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }
我需要的值是inttypes而不是stringtypes。 有没有更好的方式做这个比foreach循环数组,并将每个string转换为int?
$integerIDs = array_map('intval', explode(',', $string));
这比explode()
, array_map()
和intval()
快3倍:
$integerIDs = json_decode('[' . $string . ']', true);
所以我很好奇大量整数在答案中提到的一些方法的性能。
制备
只是在0到100之间创build一个100万个随机整数的数组。比起来,我把它们炸成了串。
$integers = array(); for ($i = 0; $i < 1000000; $i++) { $integers[] = rand(0, 100); } $long_string = implode(',', $integers);
方法1
这是Mark的回答中的一个class轮:
$integerIDs = array_map('intval', explode(',', $long_string));
方法2
这是JSON方法:
$integerIDs = json_decode('[' . $long_string . ']', true);
方法3
我想出了这个作为马克答案的修改。 这仍然使用explode()
函数,而不是调用array_map()
我使用常规的foreach
循环做的工作,以避免开销array_map()
可能有。 我也用(int)
vs intval()
parsing,但是我尝试了两种,并且在性能方面没有太大的区别。
$result_array = array(); $strings_array = explode(',', $long_string); foreach ($strings_array as $each_number) { $result_array[] = (int) $each_number; }
结果:
Method 1 Method 2 Method 3 0.4804770947 0.3608930111 0.3387751579 0.4748001099 0.363986969 0.3762528896 0.4625790119 0.3645150661 0.3335959911 0.5065748692 0.3570590019 0.3365750313 0.4803431034 0.4135499001 0.3330330849 0.4510772228 0.4421861172 0.341176033 0.503674984 0.3612480164 0.3561749458 0.5598649979 0.352314949 0.3766179085 0.4573421478 0.3527538776 0.3473439217 0.4863037268 0.3742785454 0.3488383293
底线是平均水平。 看起来第一种方法对于100万个整数来说要慢一些,但是我没有注意到方法2的3倍的性能增益。 原来, foreach
循环是我最快的一个。 我用Xdebug做了基准testing。
使用这个代码和一个闭包(在PHP 5.3
介绍),它比接受的答案快一点,对我来说,把它转换为整数的意图更清晰:
// if you have your values in the format '1,2,3,4', use this before: // $stringArray = explode(',', '1,2,3,4'); $stringArray = ['1', '2', '3', '4']; $intArray = array_map( function($value) { return (int)$value; }, $stringArray ); var_dump($intArray);
输出将是:
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );
在Mark的解决scheme中,如果试图parsing诸如“test”之类的string,则将返回array([0]=> int 0)
。
如果你有像这样的数组:
$runners = ["1","2","3","4"];
如果你想把它们转换成整数并保持在一个数组中,下面的工作应该是这样的:
$newArray = array_map( create_function('$value', 'return (int)$value;'), $runners);
不知道这是否更快,但翻转数组将两次将数字string转换为整数:
$string = "1,2,3, bla"; $ids = array_flip(array_flip(explode(',', $string))); var_dump($ids);
把事情简单化…
$intArray = array (); $strArray = explode(',', $string); foreach ($strArray as $value) $intArray [] = intval ($value);
你为什么要寻找其他方法? 循环做这个工作没有痛苦。 如果性能是你的顾虑,你可以去json_decode ()
。 人们已经发布了如何使用,所以我不包括在这里。
注意:如果使用==运算符而不是===,则string值将自动转换为数字(例如整数或双精度)(如果它们形成不带引号的有效数字)。 例如:
$str = '1'; ($str == 1) // true but ($str === 1) //false
因此,==可以解决你的问题,是有效的,但是如果你在比较中使用===就会中断。
如果您有一个multidimensional array,则前面提到的解决scheme都不会起作用。 这是我的解决scheme:
public function arrayValuesToInt(&$array){ if(is_array($array)){ foreach($array as &$arrayPiece){ arrayValuesToInt($arrayPiece); } }else{ $array = intval($array); } }
那么,只要做到这一点:
arrayValuesToInt($multiDimentionalArray);
这将使这样一个数组:
[["1","2"]["3","4"]]
看起来像这样:
[[1,2][3,4]
(这将适用于任何深度级别)