>  기사  >  백엔드 개발  >  PHP 소스 코드 15에 대한 간략한 논의: array_walk 함수에 대하여

PHP 소스 코드 15에 대한 간략한 논의: array_walk 함수에 대하여

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

이 글에서는 주로 PHP 소스 코드 Fifteen에 대해 소개합니다: 특정 참조 값을 갖는 array_walk 함수에 대해 이제 여러분과 공유합니다. 도움이 필요한 친구들이 참조할 수 있습니다

PHP 소스 코드 Fifteen에 대한 간략한 이야기 array_walk 함수

array_walk

(PHP 3 >= 3.0.3, PHP 4, PHP 5)
array_walk — 배열의 각 멤버에 사용자 함수 적용
Description

bool array_walk (array &array, callback funcname [ , 혼합 사용자 데이터] )

성공하면 TRUE를 반환하고, 실패하면 FALSE를 반환합니다.
배열 배열의 각 셀에 사용자 정의 함수 funcname을 적용합니다. 일반적으로 funcname은 두 개의 매개변수를 허용합니다. 배열 매개변수의 값이 첫 번째로 사용되고, 키 이름이 두 번째로 사용됩니다. 선택적 인수 userdata가 제공되면 이는 콜백 funcname에 세 번째 인수로 전달됩니다.
funcname 함수에 주어진 것보다 더 많은 인수가 필요한 경우 array_walk()가 funcname을 호출할 때마다 E_WARNING 수준 오류가 생성됩니다. 이러한 경고는 PHP의 오류 연산자 @를 사용하여 array_walk() 호출을 수행하거나 error_reporting()을 사용하여 억제할 수 있습니다.
참고: funcname이 배열의 값에 대해 직접 작동해야 하는 경우 funcname의 첫 번째 매개변수를 참조로 지정하세요. 따라서 이러한 셀을 변경하면 원래 배열 자체도 변경됩니다.
참고: 키 이름과 사용자 데이터를 funcname에 전달하는 것은 PHP 4.0의 새로운 기능입니다.

array_walk()는 배열의 내부 배열 포인터의 영향을 받지 않습니다. array_walk()는 포인터의 위치에 관계없이 전체 배열을 탐색합니다. (프로그램이 배열 순회 시작 부분에서 배열이 위치한 해시 테이블의 포인터를 재설정하기 때문입니다.)
콜백 함수에서 사용자는 배열 자체를 변경해서는 안 됩니다. 예를 들어 단위 추가/삭제, 단위 설정 해제 등이 있습니다. array_walk()가 작동하는 배열이 변경되면 이 함수의 동작은 정의되지 않고 예측할 수 없습니다.
프로그램 구현 지침:
확장의 마지막 호출은 php_array_walk 함수입니다.

   static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive TSRMLS_DC)

recursive == 0인 경우 이 함수는 array_walk 함수의 구현입니다.

recursive == 1인 경우 이 함수는 다음의 구현입니다. array_walk_recursive 함수

소스 코드에서 프로그램은 전체 배열을 순회하며 각 배열 요소에 대해 전달된 함수를 기반으로 관련 함수를 호출합니다.
함수 호출은 다음과 같습니다.

fci.size = sizeof(fci);
            fci.function_table = EG(function_table);
            fci.function_name = *BG(array_walk_func_name);
            fci.symbol_table = NULL;
            fci.object_pp = NULL;
            fci.retval_ptr_ptr = &retval_ptr;
            fci.param_count = userdata ? 3 : 2;
            fci.params = args;
            fci.no_separation = 0;             /* Call the userland function */
            if (zend_call_function(&fci, &array_walk_fci_cache TSRMLS_CC) == SUCCESS) {

구조는 다음과 같습니다. 함수 호출, 개인 댓글 추가됨 다음과 같습니다:

 typedef struct _zend_fcall_info {
 size_t size;    //    整个结构体的长度,等于sizeof(此函数体的变量)
 HashTable *function_table;    //    executor_globals.function_table
 zval *function_name;    //    函数名 
 HashTable *symbol_table;
 zval **retval_ptr_ptr;        //    函数的返回值
 zend_uint param_count;    //    参数个数
 zval ***params;            //    所调用函数的参数
 zval **object_pp;        //    用于对象的方法调用时,存储对象
 zend_bool no_separation;    //    是否清空参数所在的栈} zend_fcall_info;

위 내용은 개인 메모이므로, 틀린 부분이 있으면 정정해주세요!

EOF

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

관련 권장 사항:

PHP 소스 코드에 대한 간략한 토론 14: array_combine 함수 정보

PHP 소스 코드에 대한 간략한 토론 13: array_change_key_case, array_chunk 소개

PHP 소스에 대한 간략한 토론 코드 12: return_value 정보 반환 값

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

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