티스토리 뷰

php

in_array의 반란?

dhtmdgkr123 2021. 8. 5. 22:11

서론

  1. 문자열 안에 숫자가 내가 가져온 숫자가 있는지 판단해야 하는데...
  2. false가 나와야 하는데 true가 나온다?
  3. 아니 우리는 잘 쓰는데 뭐가 true고 뭐가 false라는거야?

본론

  1. 하단 코드의 결과값이 궁금한가?
  2. var_dump(in_array('1asdf',[1,2,3])); # true???
  1. 아니 이게 뭐지???php 인터프리터 소스상으로 in_array는상단 코드를 호출한다.https://github.com/php/php-src/blob/master/ext/standard/array.c#L1465상단과 같은 데이터(우리가 맨 처음 줫던 in_array 콜 시파라미터)를 가져온다.
     if (strict) {
         // 여기는 파라미터를 안줫는데 이때 php공식문서 상 default 파라미터는 false라서 else로 넘어감
     } else {
         // 여기서 수행 시작
     }
    https://github.com/php/php-src/blob/master/ext/standard/array.c#L1518
    이후 해당 조건문에 true판단이 되어fast_equal_check_string 함수는 하단 헤더파일에 구현이 되어있는데
    https://github.com/php/php-src/blob/master/Zend/zend_operators.h#L829해당 조건문에 걸리게 된다
    왜냐하면 '1asdf'는 '1', 'a', 's', 'd', 'f' 로 나뉘어져서
    루프문을 돌기 때문이다.
    이후 return 을 zend_fast_equal_strings로 스트링으로 캐스팅 후 비교를 하면서 true 리턴이 떨어지고RETURN_TRUE; 매크로를 실행하며 in_array는 true 리턴을 하게 된다.
  2. if (behavior == 0) { // 여기 조건문을 수행한다. RETURN_TRUE; }
  3. if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { return zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); }
  4. fast_equal_check_string 함수를 콜을 하게 된다
  5. 이후
    https://github.com/php/php-src/blob/master/ext/standard/array.c#L1465
  6. ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_ZVAL(value) // 첫번째 파라미터 '1asdf' Z_PARAM_ARRAY(array) // 두번째 파라미터 [1,2,3] Z_PARAM_OPTIONAL Z_PARAM_BOOL(strict) // 3번째 파라미터 strict여부 ZEND_PARSE_PARAMETERS_END();
  7. php_search_array 함수 내부 구현중 첫번째 파라미터로
  8. php_search_array(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
  9. https://github.com/php/php-src/blob/master/ext/standard/array.c#L1554

결론

하단 예제와 같이 사용하자

in_array('1asdf',[1,2,3], true)

공식문서 잘 보도록 하자...

https://www.php.net/manual/en/function.in-array.php

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함