?array_get()
array_get方法使用”.“号从嵌套数组中获取值:
???$array = [‘products‘ => [‘desk‘ => [‘price‘ => 100]]]; ???$value = array_get($array, ‘products.desk‘); ???// [‘price‘ => 100]
array_get函数还接收一个默认值,如果指定键不存在的话则返回该默认值:
?$value = array_get($array, ‘names.john‘, ‘default‘);
不适用的场合:
?????数组key中含有.的内容。
我们先来看看它的php实现方式:
function array_get($array, $key, $default = null) ???{ ???????if (is_null($key)) { ???????????return $array; ????????} ???????if (isset($array[$key])) { ???????????return $array[$key]; ???????} ???????foreach (explode(‘.‘, $key) as $segment) { ???????????if (! is_array($array) || ! array_key_exists($segment, $array)) { ???????????????return value($default); ???????????} ???????????$array = $array[$segment]; ???????} ???????return $array; ???}
当key为空的时候,上述函数直接返回了整个array的内容, 在用C实现的时候我选择返回了空, 代码如下:
PHP_FUNCTION(array_get){ ???zval *arr; // array ???zend_string* strkey; // key ???zval *defaultval = NULL; // default value ???zval *retval; ???HashTable *arrHashTable; ???zval *dest_entry; ???if (zend_parse_parameters(ZEND_NUM_ARGS(), "zS|z", &arr, ????????&strkey, &defaultval) == FAILURE) { ???????return; ???} ???if ((retval = zend_hash_find(Z_ARRVAL_P(arr), strkey)) != NULL){ ???????RETURN_ZVAL(retval, 1, 0); ???} ????// foreach ???if (zend_memrchr(ZSTR_VAL(strkey), ‘.‘, ZSTR_LEN(strkey))) { ???????char *entry, *ptr, *seg; ???????HashTable *target = Z_ARRVAL_P(arr); ???????entry = estrndup(ZSTR_VAL(strkey), ZSTR_LEN(strkey)); ???????if ((seg = php_strtok_r(entry, ".", &ptr))) { ???????????do { ???????????????if (target == NULL || (retval = zend_symtable_str_find(target, seg, strlen(seg))) == NULL) { ???????????????????break; ???????????????} ???????????????if (Z_TYPE_P(retval) == IS_ARRAY) { ???????????????????target = Z_ARRVAL_P(retval); ???????????????} else { ???????????????????target = NULL; ???????????????} ???????????} while ((seg = php_strtok_r(NULL, ".", &ptr))); ???????} ???????efree(entry); ???????if (retval) { ???????????RETURN_ZVAL(retval, 1, 0); ???????} ???} ???// end foreach ???if (defaultval) { ???????RETURN_ZVAL(defaultval, 1, 0); ???} else { ???????RETURN_NULL(); ???}}
php: 帮助函数 array_get 的扩展实现方式
原文地址:http://blog.51cto.com/9681602/2134113