문제

하나가 더 선호됩니까, 아니면 다른 것보다 성능이 더 좋습니까?

도움이 되었습니까?

해결책

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 값으로 통과하면 숫자로 구문 분석 할 수 있습니다.

enter image description here

함수의 성능을 비교하려고한다면 PHP 5.5.30 결과는 다음과 같습니다.

enter image description here

이것은 내가 벤치 마크에 사용한 코드입니다

// 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>&nbsp;</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, 플로트 없음, 문자열로 완료된 숫자만으로 작동합니다.

기억하다:문자열로서의 정수, 음수 없음, 부동 소수점 숫자 없음, 숫자 유형 없음, 문자 없음, 문자열로서의 숫자만.

조감도:

enter image description here

덕분에 http://php.net/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top