is_int()와 ctype_digit() 사이에 차이점이 있습니까?
문제
하나가 더 선호됩니까, 아니면 다른 것보다 성능이 더 좋습니까?
해결책
is_int()
인수가 정수 유형 인 경우 true를 반환합니다. ctype_digit()
문자열 인수를 취하고 문자열의 모든 문자가 숫자 인 경우 true를 반환합니다.
예시:
┌──────────┬───────────┬────────────────┐
│ │ is_int: │ ctype_digit: │
├──────────┼───────────┼────────────────┤
│ 123 │ true │ false │
├──────────┼───────────┼────────────────┤
│ 12.3 │ false │ false │
├──────────┼───────────┼────────────────┤
│ "123" │ false │ true │
├──────────┼───────────┼────────────────┤
│ "12.3" │ false │ false │
├──────────┼───────────┼────────────────┤
│ "-1" │ false │ false │
├──────────┼───────────┼────────────────┤
│ -1 │ true │ false │
└──────────┴───────────┴────────────────┘
다른 팁
도 있습니다 is_numeric
값으로 통과하면 숫자로 구문 분석 할 수 있습니다.
함수의 성능을 비교하려고한다면 PHP 5.5.30 결과는 다음과 같습니다.
이것은 내가 벤치 마크에 사용한 코드입니다
// print table cell and highlight if lowest value is used
function wr($time1, $time2, $time3, $i) {
if($i == 1) $time = $time1;
if($i == 2) $time = $time2;
if($i == 3) $time = $time3;
echo('<td>');
if(min($time1, $time2, $time3) === $time) printf('<b>%.4f</b>', $time);
else printf('%.4f', $time);
echo('</td>');
}
$test_cases = array( 123, 12.3, '123', true);
$tests = 1000000;
$result = true; // Used just to make sure cycles won't get optimized out
echo('<table>'.PHP_EOL);
echo('<tr><td> </td><th>is_int</th><th>ctype_digit</th><th>is_numeric</th></tr>');
foreach($test_cases as $case) {
echo('<tr><th>'.gettype($case).'</th>');
$time = microtime(true);
for($i = 0; $i < $tests; $i++) {
$result |= is_int((int)rand());
}
$time1 = microtime(true)-$time;
$time = microtime(true);
for($i = 0; $i < $tests; $i++) {
$result |= ctype_digit((int)rand());
}
$time2 = microtime(true)-$time;
$time = microtime(true);
for($i = 0; $i < $tests; $i++) {
$result |= is_numeric((int)rand());
}
$time3 = microtime(true)-$time;
wr($time1, $time2, $time3, 1);
wr($time1, $time2, $time3, 2);
wr($time1, $time2, $time3, 3);
echo('</tr>'.PHP_EOL);
}
echo('</table>');
exit();
마지막으로 걱정해야 할 것은이 중 하나가 얼마나 빠른지입니다. 정수가되는 문자열을 확인하는 것이 코드에서 병목 현상이 될 방법은 없습니다.
Ctype ~ 아니다 언제나 거짓을 반환합니다 정수 유형에서.
foreach(range(-1000 , 1000)as $num){
if(ctype_digit($num)){
echo $num . ", ";
}
}
ctype_digit 다음 정수 유형 번호에 대해 true를 반환합니다.
-78, -77, -71,48,49,50,51,52,53,54,55,56,57,178,179,185, 256,257,258,259,260,261,262,263,264,266,267,268,269,270 ~ 1000
기본 관행은 모든 숫자로 문자열 EQ strval ($ num) 또는 (문자열) $ num으로 사례를 제기하는 것입니다.이 경우 음수 값 (-78)은 항상 false를 반환합니다.
IS_INT는 -2147483647에서 2147483647 사이의 int 유형 값에서 true를 반환합니다. 해당 값을 초과하면 32bits 시스템에서 실행중인 것으로 추정되면 거짓을 반환합니다. 64BITS에서 -9223372036854775807에서 922337203685475807 범위로 올라갈 수 있습니다.
개인적으로 말하기가 매우 어렵습니다. CTYPE_DIGIT는 IS_INT보다 빠르지 만 문자열 성능에 모든 값을 시전 해야하는 경우 전체적으로 감소합니다.
인수가 int 유형인지 숫자가있는 문자열인지 실제로 신경 쓰지 않으면 is_numeric을 사용하십시오. 플로트에 대해서도 true가 반환됩니다.
CTYPE_DIGIT 정수 범위가 음수 범위 또는 0과 47 또는 58에서 255 사이 인 경우 False를 반환합니다. 다음 스 니펫을 사용하여 CType_Digit의 동작을 확인할 수 있습니다.
setlocale(LC_ALL, 'en_US.UTF-8');
var_dump(
true === array_every(range(-1000, -1), 'ctype_digit_returns_false'),
true === array_every(range(0, 47), 'ctype_digit_returns_false'),
true === array_every(range(48, 57), 'ctype_digit_returns_true'),
true === array_every(range(58, 255), 'ctype_digit_returns_false'),
true === array_every(range(256, 1000), 'ctype_digit_returns_true')
);
// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every
function array_every(array $array, $callable)
{
$count = count($array);
for ($i = 0; $i < $count; $i +=1) {
if (!$callable($array[$i])) {
return false;
}
}
return true;
}
function ctype_digit_returns_true($v)
{
return true === ctype_digit($v);
}
function ctype_digit_returns_false($v)
{
return false === ctype_digit($v);
}
매우 흥미롭습니다 :) 모든 이야기는 다음과 같습니다.
is_numeric:
- 변수가 숫자인지 숫자인지 또는 숫자 문자열인지를 찾습니다.'true'
또 다른'false'
.기억하다:문자만 숫자 없음 모든 유형 :)
is_init
— 변수 유형이 정수인지 확인합니다. 값이 순전히 정수이면 'true'를 반환하고 그렇지 않으면 'false'를 반환합니다.기억하다:문자 없음, 이중 또는 음수, 정수만
in_integer
— is_int()의 별칭
intval:
- 변수의 정수 값을 얻으십시오. 모든 종류의 값을 취하고 정수 값 만 반환합니다. 값이 음수 인 경우 반환됩니다. '-Integer
' 값.상당한 가치는 정수, 플로트, 음수 또는 '입니다.NumberString
' 또는 'NumberStringCharacter
'.문자열 "에서 정수 값을 뺍니다.If String Starts with Number
".
- 숫자문자열 = 문자열 형식의 숫자 값
- 번호문자열문자 = 숫자로 시작하는 문자열
기억하다:Number로 시작하는 Number, Float, Negative 또는 String에서 정수 값을 얻습니다.
ctype_digit
— 숫자 문자를 확인하세요. 정수가 문자열 형식으로 제공되면 'true
' 또 다른 'false
'.StringNumber, 플로트 없음, 문자열로 완료된 숫자만으로 작동합니다.기억하다:문자열로서의 정수, 음수 없음, 부동 소수점 숫자 없음, 숫자 유형 없음, 문자 없음, 문자열로서의 숫자만.
조감도:
덕분에 http://php.net/