Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion des PHP-Quellcodes 15: Über die Funktion array_walk

Eine kurze Diskussion des PHP-Quellcodes 15: Über die Funktion array_walk

不言
不言Original
2018-06-28 17:28:331555Durchsuche

In diesem Artikel wird hauptsächlich die kurze Diskussion zum PHP-Quellcode 15 vorgestellt: In Bezug auf die Funktion array_walk hat sie einen bestimmten Referenzwert. Jetzt können Freunde in Not darauf verweisen.

Eine kurze Beschreibung Diskussion über PHP-Quellcode 10 Fünf: Über die array_walk-Funktion

array_walk

(PHP 3 >= 3.0.3, PHP 4, PHP 5)
array_walk – Benutzerfunktion anwenden auf jedes Mitglied im Array
Beschreibung

bool array_walk (array &array, callback funcname [, Mixed userdata] )

Gibt TRUE zurück, wenn erfolgreich, und FALSE, wenn fehlgeschlagen.
Wenden Sie die benutzerdefinierte Funktion funcname auf jede Zelle im Array-Array an. Normalerweise akzeptiert funcname zwei Parameter. Als erster Wert wird der Wert des Array-Parameters und als zweiter der Schlüsselname verwendet. Wenn das optionale Argument userdata angegeben wird, wird es als drittes Argument an Callback funcname übergeben.
Wenn die Funktion funcname mehr Argumente als angegeben erfordert, wird jedes Mal, wenn array_walk() funcname aufruft, ein Fehler der Stufe E_WARNING generiert. Diese Warnungen können unterdrückt werden, indem dem array_walk()-Aufruf der PHP-Fehleroperator @ vorangestellt wird oder indem error_reporting() verwendet wird.
Hinweis: Wenn funcname direkt auf die Werte im Array zugreifen muss, geben Sie den ersten Parameter von funcname als Referenz an. Daher verändern alle Änderungen an diesen Zellen auch das ursprüngliche Array selbst.
Hinweis: Die Übergabe von Schlüsselnamen und Benutzerdaten an funcname ist neu in PHP 4.0.

array_walk() wird vom internen Array-Zeiger des Arrays nicht beeinflusst. array_walk() durchläuft das gesamte Array, unabhängig von der Position des Zeigers. (Dies liegt daran, dass das Programm den Zeiger der Hash-Tabelle zurücksetzt, in der sich das Array zu Beginn des Array-Durchlaufs befindet.)
Der Benutzer sollte das Array selbst in der Rückruffunktion nicht ändern. Zum Beispiel Einheiten hinzufügen/löschen, Einheiten deaktivieren usw. Wenn sich das Array ändert, auf das array_walk() reagiert, ist das Verhalten dieser Funktion undefiniert und unvorhersehbar.
Beschreibung der Programmimplementierung:
Der letzte Aufruf der Erweiterung ist die Funktion php_array_walk:

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

Bei rekursiv == 0 implementiert diese Funktion die Funktion array_walk

Bei rekursiv == 1, diese Funktion ist die Implementierung der Funktion array_walk_recursive

Im Quellcode durchläuft das Programm das gesamte Array und führt für jedes Array-Element relevante Funktionsaufrufe basierend auf der übergebenen Funktion durch
Die Der Funktionsaufruf lautet wie folgt:

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) {

In diesem Funktionsaufruf wird eine Struktur verwendet:

 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;

Das Obige ist eine persönliche Notiz. Bitte korrigiert mich!

EOF

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Eine kurze Diskussion des PHP-Quellcodes 14: Über die Funktion array_combine

Eine kurze Diskussion von PHP-Quellcode 13: Einführung in array_change_key_case, array_chunk

Eine kurze Diskussion des PHP-Quellcodes 12: Über return_value Rückgabewert

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion des PHP-Quellcodes 15: Über die Funktion array_walk. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn