>  기사  >  백엔드 개발  >  PHP 소스 코드에 대한 간략한 토론 19: array_file, range 함수에 대하여

PHP 소스 코드에 대한 간략한 토론 19: array_file, range 함수에 대하여

不言
不言원래의
2018-06-28 17:41:161892검색

이 글은 주로 PHP 소스 코드에 대한 간단한 토론을 소개합니다. 19: array_file 및 range 함수에 대해 특정 참조 값이 있습니다. 이제 필요한 친구들이 참조할 수 있습니다. 19: array_file 정보, 범위 함수

array_fill

(PHP 4 >= 4.2.0, PHP 5)


array_fill — 주어진 값으로 배열을 채웁니다

Description

array array_fill ( int start_index, int num, 혼합 값 )

array_fill( ) start_index 매개변수에 의해 지정된 키부터 시작하여 value 매개변수의 값으로 num 항목으로 배열을 채웁니다. num은 0보다 큰 숫자여야 합니다. 그렇지 않으면 PHP가 경고를 발행합니다.

start_index 매개변수의 경우 문자열, 정수 또는 부동 소수점 유형만 가능합니다.

소스 코드는 다음과 같습니다.

switch (Z_TYPE_PP(start_key)) {case IS_STRING:case IS_LONG:case IS_DOUBLE:
    .......    convert_to_long_ex(start_key);
    ......}

프로그램은 먼저 return_value에 첫 번째 값을 할당한 다음 num을 1회 반복합니다. 이 값에 refcount를 추가하면 return_value

range

(PHP 3 >= 3.0.8, PHP 4, PHP 5)


range의 해시 테이블에 추가됩니다. — 지정된 셀 범위를 포함하는 배열을 만듭니다

설명

배열 범위(낮음 혼합, 높음 혼합 [, 숫자 단계] )

range()는 자신을 포함하여 배열의 낮은 값에서 높은 값으로 셀을 반환합니다. 낮음 > 높음인 경우 순서는 높음에서 낮음으로 이동합니다.

새 매개변수: 선택적 단계 매개변수가 PHP 5.0.0에 새로 추가되었습니다.

걸음값이 주어지면 단위 ​​간 걸음값으로 사용됩니다. 단계는 긍정적이어야 합니다. 지정하지 않으면 단계의 기본값은 1입니다.

코드에서 볼 수 있듯이 이 함수는 문자 배열, 부동 소수점 배열 및 정수 배열만 지원하고 증가 및 감소 형태를 모두 지원합니다(버전 4.0.1 이후에만 사용 가능)

문자 배열을 예로 들어보세요:

 if (Z_TYPE_P(zlow) == IS_STRING && Z_TYPE_P(zhigh) == IS_STRING && Z_STRLEN_P(zlow) >= 1 && Z_STRLEN_P(zhigh) >= 1) {
    int type1, type2;
    unsigned char *low, *high;
    long lstep = (long) step; 
    type1 = is_numeric_string(Z_STRVAL_P(zlow), Z_STRLEN_P(zlow), NULL, NULL, 0);
    type2 = is_numeric_string(Z_STRVAL_P(zhigh), Z_STRLEN_P(zhigh), NULL, NULL, 0);
    if (type1 == IS_DOUBLE || type2 == IS_DOUBLE || is_step_double) {
        goto double_str;
    } else if (type1 == IS_LONG || type2 == IS_LONG) {
        goto long_str;
    }
    convert_to_string(zlow);    //    转化为字符串,此函数的实现在zend_operators.c的536行:ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC)
    convert_to_string(zhigh);
    low = (unsigned char *)Z_STRVAL_P(zlow);    //    当所给字符串长度大于1时,取第一个字符
    high = (unsigned char *)Z_STRVAL_P(zhigh);     if (*low > *high) { //    递减数组
    if (lstep <= 0) {
        err = 1;
        goto err;
    }
    for (; *low >= *high; (*low) -= (unsigned int)lstep) {
        add_next_index_stringl(return_value, low, 1, 1);
        if (((signed int)*low - lstep) < 0) {
            break;
        }
    }
    } else if (*high > *low) { //    递增数组
    if (lstep <= 0) {
        err = 1;
        goto err;
    }
    for (; *low <= *high; (*low) += (unsigned int)lstep) {
        add_next_index_stringl(return_value, low, 1, 1);
        if (((signed int)*low + lstep) > 255) {    //    只支持ASCII的255个字符
            break;
        }
    }
    } else {    //    开始和结束相等,则只返回包含一个元素的数组
        add_next_index_stringl(return_value, low, 1, 1);}

부동소수점과 정수의 처리는 기본적으로 비슷하고, 해시테이블을 작성하는 방식만 다릅니다

부동소수점형은 add_next_index_double을 사용합니다

정수형은 add_next_index_long을 사용합니다


위 내용이 이 글의 전체 내용이길 바랍니다. 모든 사람의 학습에 도움이 될 것입니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트에 주목하세요!

관련 추천:

PHP 소스 코드에 대해 이야기하기 18: array_diff_key, array_diff_assoc, array_udiff_assoc에 대해 함수

PHP 소스 코드 16에 대한 간략한 토론: array_count_values ​​​​함수에 대하여

위 내용은 PHP 소스 코드에 대한 간략한 토론 19: array_file, range 함수에 대하여의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.