PHP에서는 3가지 방법을 사용하여 문자열을 정수로 변환할 수 있습니다.
1. 강제 형 변환방법
강제 형 변환은 "변환할 변수 앞에 대상 형을 괄호 안에 추가"하는 방법입니다.
<?php $foo = "1"; // $foo 是字符串类型 $bar = (int)$foo; // $bar 是整型 ?>
정수의 경우 force Conversion 유형 이름은 int 또는 정수입니다.
2.내장 함수메서드
내장 함수 메서드는 PHP에 내장된 함수인 intval을 사용하여 변수를 변환하는 것입니다.
<?php $foo = "1"; // $foo 是字符串类型 $bar = intval($foo); // $bar 是整型 ?>
intval 함수의 형식은 다음과 같습니다:
int intval(mixed $var [, int $base]);
PHP 매뉴얼에는 intval()을 배열과 객체 변환에 사용할 수 없다고 명시되어 있습니다. 그러나 테스트를 마친 후에는 배열을 변환할 때 문제가 없을 것입니다. 변환된 값은 예상한 대로 0이 아니라 1입니다. PHP 내에서 배열 유형 변수도 0이 아닌 값을 갖는 것으로 간주되기 때문입니다.
객체를 변환할 때 PHP는 다음과 같은 알림을 표시합니다.
xxxx 클래스의 객체는 xx행의 xxxxx.php에서 int로 변환할 수 없습니다.
변환 값도 1입니다.
3.Format stringmethod
Format string 방식은 유형 변환 목적을 달성하기 위해 sprintf의 %d를 사용하여 지정된 변수의 형식을 지정하는 것입니다.
<?php $foo = "1"; // $foo 是字符串类型 $bar = sprintf("%d", $foo); // $bar 是字符串类型 ?>
엄밀히 말하면 sprintf의 변환 결과는 여전히 문자열 형식이므로 문자열을 정수로 변환하는 방법으로 간주하면 안 됩니다. 그러나 그의 처리 이후의 문자열 값은 그야말로 "강제로 문자열 형식으로 변환되는 정수"가 됐다.
일반 프로그래머라면 이걸 보고 끝이지만, 비정상 프로그래머라면 다음과 같은 성능 테스트를 해보자.
1. 기본 기능 테스트
다음 배열 설정:
<?php $a[] = "1"; $a[] = "a1"; $a[] = "1a"; $a[] = "1a2"; $a[] = "0"; $a[] = array('4',2); $a[] = "2.3"; $a[] = "-1"; $a[] = new Directory(); ?>
3개 사용 배열의 요소 변환 변환 상태를 확인하기 위해 위의 순서대로 설명합니다. 프로그램 소스코드는 다음과 같습니다.
<?php $a[] = "1"; $a[] = "a1"; $a[] = "1a"; $a[] = "1a2"; $a[] = "0"; $a[] = array('4',2); $a[] = "2.3"; $a[] = "-1"; $a[] = new Directory(); // int print "(int)<br />"; foreach($a as $v) { var_dump((int)$v); print "<br />"; } // intval print "intval();<br />"; foreach($a as $v) { var_dump(intval($v)); print "<br />"; } // sprintf print "sprintf();<br />"; foreach($a as $v) { var_dump(sprintf("%d", $v)); print "<br />"; } ?>
프로그램의 최종 실행 결과는 다음과 같습니다.(객체 변환 시 나타나는 알림이 제거되었습니다.)
(int) int(1) int(0) int(1) int(1) int(0) int(1) int(2) int(-1) int(1) intval(); int(1) int(0) int(1) int(1) int(0) int(1) int(2) int(-1) int(1) sprintf(); string(1) "1" string(1) "0" string(1) "1" string(1) "1" string(1) "0" string(1) "1" string(1) "2" string(2) "-1" string(1) "1"
3번의 변환 결과는 다음과 같다고 볼 수 있습니다. 정확히 똑같습니다. 따라서 기능적으로 말하면 세 가지 방법 모두 변환 작업이 가능하므로 다음 단계는 어느 것이 더 효율적인지 확인하는 것입니다.
2. 성능 테스트
<?php $foo = "1';Select * ..."; ?> 获取时间点的函数如下(用于获取测试起始点和结束点,以计算消耗时间): <?php ** * Simple function to replicate PHP 5 behaviour */ function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } ?>
테스트 과정은 각 메소드를 사용하여 $foo 변수를 1,000,000회(100만회) 출력하고, 총 3세트의 테스트를 진행하여 최대한 오류를 냅니다. 테스트 프로그램은 다음과 같습니다.
<?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $foo = "1';Select * ..."; // (int) $fStart = microtime_float(); for($i=0;$i<1000000;$i++) { $bar = (int)$foo; } $fEnd = microtime_float(); print "(int):" . ($fEnd - $fStart) . "s<br />"; // intval() $fStart = microtime_float(); for($i=0;$i<1000000;$i++) { $bar = intval($foo); } $fEnd = microtime_float(); print "intval():" . ($fEnd - $fStart) . "s<br />"; // sprintf() $fStart = microtime_float(); for($i=0;$i<1000000;$i++) { $bar = sprintf("%d", $foo); } $fEnd = microtime_float(); print "sprintf():" . ($fEnd - $fStart) . "s<br />"; ?>
최종 테스트 결과:
(int):0.67205619812012s intval():1.1603000164032s sprintf():2.1068270206451s (int):0.66051411628723s intval():1.1493890285492s sprintf():2.1008238792419s (int):0.66878795623779s intval():1.1613430976868s sprintf():2.0976209640503s
강제 형식 변환을 사용하여 문자열을 정수로 변환하는 것이 가장 빠르다는 것을 알 수 있습니다.
위 내용은 PHP가 문자열을 정수로 변환하는 방법과 성능 테스트 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!