PHP 소스 코드 18에 대한 간략한 토론: array_diff_key, array_diff_assoc, array_udiff_assoc 함수 정보

不言
풀어 주다: 2023-04-01 22:36:01
원래의
2462명이 탐색했습니다.

이 글에서는 주로 PHP 소스 코드에 대해 소개합니다. 18: 특정 참조 값을 갖는 array_diff_key, array_diff_assoc, array_udiff_assoc 함수에 대해 이제 필요한 친구들이 참조할 수 있도록 공유합니다.

PHP 소스 코드에 대한 간단한 이야기입니다. 18: array_diff_key, array_diff_assoc, array_udiff_assoc 함수 정보

【array_diff_key】

(PHP 5 >= 5.1.0RC1)
array_diff_key — 키 이름 비교를 사용하여 배열의 차이를 계산합니다.
Description

array array_diff_key (array array1, 배열 array2 [, array ...] )

array_diff_key() array1에는 나타나지만 다른 매개변수 배열에는 나타나지 않는 모든 키 이름의 값이 포함된 배열을 반환합니다. 관계는 변경되지 않은 상태로 유지됩니다.

【array_diff_assoc】

(PHP 4 >= 4.3.0, PHP 5)
array_diff_assoc — 인덱스 확인
Description

array array_diff_assoc (array array1, array array2 [, array ...] )

array_diff_assoc()은 다른 매개변수 배열에 없는 array1의 모든 값을 포함하는 배열을 반환합니다. array_diff()와 달리 키 이름도 비교에 사용됩니다.

이 세 함수를 합친 이유는 그들이 호출하는 마지막 함수가 하나의 함수이기 때문입니다: php_array_diff_key
[array_diff_uassoc]

(PHP 5)
array_diff_uassoc — 사용자가 제공한 콜백 함수를 사용하여 인덱스 검사를 수행하여 배열 세트의 차이점
Description

array array_diff_uassoc (array array1, array array2 [, array ..., callback key_compare_func] )

array_diff_uassoc()은 array1의 모든 값을 포함하지만 다른 매개변수는 포함하지 않는 배열을 반환합니다. 배열 .

이 세 가지 함수가 php-array_diff_key를 호출하는 방식은 다음과 같습니다:

  array_diff_key:         php_array_diff_key(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_COMP_DATA_NONE);array_diff_assoc:      php_array_diff_key(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_COMP_DATA_INTERNAL);array_udiff_assoc:    php_array_diff_key(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_COMP_DATA_USER);
로그인 후 복사

매개변수의 매크로 정의는 다음과 같습니다:

  #define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, return_value_ptr, this_ptr, return_value_used TSRMLS_CC #define DIFF_COMP_DATA_NONE    -1#define DIFF_COMP_DATA_INTERNAL 0#define DIFF_COMP_DATA_USER     1
로그인 후 복사

php_array_diff_key 함수는 먼저 들어오는 data_compare_type(예: 위에 정의된 세 개의 매크로) 함수를 비교한 다음 첫 번째 배열을 순회하고 각 요소를 다른 배열과 비교하여 다른 숫자가 있는지 확인하세요

존재하는 경우 삭제하세요
이 함수의 소스 코드에 댓글을 남겨주세요.

 for (i = 0; i < argc; i++) {
        if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1);
            RETVAL_NULL();
            goto out;    //    goto语句,这个貌似一般是高手用的,嘿嘿
        }
    } 
    array_init(return_value);    //    返回数组初始化,初始化存储此数组的Hash Table     for (p = Z_ARRVAL_PP(args[0])->pListHead; p != NULL; p = p->pListNext) {    //    遍历第一个参数包含的双向链表
        if (p->nKeyLength == 0) {    //    数组索引为数字
            ok = 1;
            for (i = 1; i < argc; i++) {    //    对其它的数组进行判断
                if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == SUCCESS &&
                    (!diff_data_compare_func ||
                     diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)) {
                    ok = 0;
                    break;
                }
            }
            if (ok) {    在第一个数组中,不在其它数组中                (*((zval**)p->pData))->refcount++;
                zend_hash_index_update(Z_ARRVAL_P(return_value), p->h, p->pData, sizeof(zval*), NULL);
            }
        } else {    //    索引为字符串
            ok = 1;
            for (i = 1; i < argc; i++) {
                if (zend_hash_quick_find(Z_ARRVAL_PP(args[i]), p->arKey, p->nKeyLength, p->h, (void**)&data) == SUCCESS &&
                    (!diff_data_compare_func ||
                     diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0)) {
                    ok = 0;
                    break;
                }
            }
            if (ok) {
                (*((zval**)p->pData))->refcount++;
                zend_hash_quick_update(Z_ARRVAL_P(return_value), p->arKey, p->nKeyLength, p->h, p->pData, sizeof(zval*), NULL);
            }
        }
    }
로그인 후 복사

비교 기능 정보:

DIFF_COMP_DATA_NONE 매개변수는 NULL에 해당합니다. 즉, 비교가 없습니다.
DIFF_COMP_DATA_INTERNAL 매개변수는 zval_compare에 해당합니다. 즉, 인덱스와 값이 모두 비교됩니다.
DIFF_COMP_DATA_USER 매개변수에 해당합니다. 사용자 정의 함수인 zval_user_compare

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

PHP 소스 코드 17에 대한 간략한 토론: array_diff, array_udiff, array_diff_ukey, array_diff_uassoc, array_udiff_uassoc 소개

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

PHP 소스 코드 15에 대해 이야기하기: array_walk 함수에 대하여

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿