您好,欢迎访问一九零五行业门户网

整理的一篇zend中的数组操作

数组的值存储在zvalue_value.ht字段中,ht是一个hashtable的数据
在zend/zend_vm_execute.h文件中
static int zend_fastcall  zend_init_array_spec_cv_const_handler(zend_opcode_handler_args)
{
        zend_op *opline = ex(opline);
        array_init(&ex_t(opline->result.u.var).tmp_var); //分配数组内存空间,初始化
        if (is_cv == is_unused) {
                zend_vm_next_opcode();
#if 0 || is_cv != is_unused
        } else {
                return zend_add_array_element_spec_cv_const_handler(zend_opcode_handler_args_passthru);
#endif        }
}
初始化数组的函数是 array_init
zend_api int _array_init(zval *arg, uint size zend_file_line_dc) /* {{{ */
{
        alloc_hashtable_rel(z_arrval_p(arg)); //分配内存
        _zend_hash_init(z_arrval_p(arg), size, null, zval_ptr_dtor, 0 zend_file_line_relay_cc);
        z_type_p(arg) = is_array; //类型为数组
        return success;
}
看到没有,hash表初始化函数_zend_hash_init
在php扩展中我们可以这么写:
php_function(test)
{
        zval *value;
        make_std_zval(value);
        array_init(value);
        zend_set_symbol(eg(active_symbol_table),star,value);
添加一个元素的关键代码
add_assoc_long(zval *array, char *key, long n);    添加一个长整型元素。
add_assoc_unset(zval *array, char *key);             添加一个 unset 元素。
add_assoc_bool(zval *array, char *key, int b);       添加一个布尔值。
add_assoc_resource(zval *array, char *key, int r); 添加一个资源。
add_assoc_double(zval *array, char *key, double d); 添加一个浮点值。
add_assoc_string(zval *array, char *key, char *str, int duplicate); 添加一个字符串。duplicate 用于表明这个字符串是否要被复制到 zend 的内部内存。
add_assoc_stringl(zval *array, char *key, char *str, uint length, int duplicate); 添加一个指定长度的字符串。
add_assoc_zval(zval *array, char *key, zval *value); 添加一个 zval 结构。 
add_index_long(zval *array, uint idx, long n); 添加一个长整型元素。
add_index_unset(zval *array, uint idx); 添加一个 unset 元素。
add_index_bool(zval *array, uint idx, int b); 添加一个布尔值。
add_index_resource(zval *array, uint idx, int r); 添加一个资源。
add_index_double(zval *array, uint idx, double d); 添加一个浮点值。
add_index_string(zval *array, uint idx, char *str, int duplicate); 
添加一个字符串。duplicate 用于表明这个字符串是否要被复制到 zend 的内部内存。
add_index_stringl(zval *array, uint idx, char *str, uint length, int duplicate); 添加一个指定长度的字符串。
add_index_zval(zval *array, uint idx, zval *value); 添加一个 zval 结构。 
add_next_index_long(zval *array, long n); 添加一个长整型元素。
add_next_index_unset(zval *array); 添加一个 unset 元素。
add_next_index_bool(zval *array, int b); 添加一个布尔值。
add_next_index_resource(zval *array, int r); 添加一个资源。
add_next_index_double(zval *array, double d); 添加一个浮点值。
add_next_index_string(zval *array, char *str, int duplicate); 添加一个字符串。duplicate 用于表明这个字符串是否要被复制到 zend 的内部内存。
add_next_index_stringl(zval *array, char *str, uint length, int duplicate); 添加一个指定长度的字符串。
add_next_index_zval(zval *array, zval *value); 添加一个 zval 结构。 添加另外一个数组、对象或流等数据。
以上就介绍了整理的一篇zend中的数组操作,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息