Introduction to Variables
Working with HashTable
Working with Variables
PHP Manual

## Working with Arrays

Arrays are stored in HashTable strucures, and have the zval type IS_ARRAY. The API functions for creating, destroying and manipulating these structures as variables are documented here and can be found in `Zend/zend_API.h`

HashTable as Variable API
Prototype | Description
--- | ---
`void array_init(zval* pzval)` | initializes the variable as a `HashTable`, setting type and appropriate destructor function for the `HashTable`
`void array_init_size(zval* pzval)` | initializes the variable as array_init with a minimum of `size` buckets

> Note:

> Do not squint too hard looking for array_destroy: to destroy a variable array you should call `zval_ptr_dtor` on the variable, if there are no other references to the variable it will result in the array being destroyed.

Indexed Arrays API
Prototype
`int add_index_long(zval* pzval, ulong index, long value)`
`int add_index_null(zval* pzval, ulong index)`
`int add_index_bool(zval* pzval, ulong index, zend_bool value)`
`int add_index_bool(zval* pzval, ulong index, zend_bool value)`
`int add_index_resource(zval* pzval, ulong index, uint value)`
`int add_index_double(zval* pzval, ulong index, double value)`
`int add_index_string(zval* pzval, ulong index, char* string, zend_bool duplicate)`
`int add_index_stringl(zval* pzval, ulong index, char* string, uint length, zend_bool duplicate)`
`int add_index_zval(zval* pzval, ulong index, zval* value)`
`int add_next_index_long(zval* pzval, long value)`
`int add_next_index_null(zval* pzval)`
`int add_next_index_bool(zval* pzval, zend_bool value)`
`int add_next_index_resource(zval* pzval, uint value)`
`int add_next_index_double(zval* pzval, double value)`
`int add_next_index_string(zval* pzval, const char* string, zend_bool dulpicate)`
`int add_next_index_stringl(zval* pzval, const char* string, uint length, zend_bool duplicate)`
`int add_next_index_zval(zval* pzval, zval* value)`

Associative Arrays API
Prototype
`int add_assoc_long(zval* pzval, const char* key, long value)`
`int add_assoc_long_ex(zval* pzval, const char* key, uint klen, long value)`
`int add_assoc_null(zval* pzval, const char* key)`
`int add_assoc_null_ex(zval* pzval, const char* key, uint klen)`
`int add_assoc_bool(zval* pzval, const char* key, zend_bool value)`
`int add_assoc_bool(zval* pzval, const char* key, zend_bool value)`
`int add_assoc_bool_ex(zval* pzval, const char* key, uint klen, zend_bool value)`
`int add_assoc_resource(zval* pzval, const char* key, uint value)`
`int add_assoc_resource_ex(zval* pzval, const char* key, uint klen, uint value)`
`int add_assoc_double(zval* pzval, const char* key, double value)`
`int add_assoc_double_ex(zval* pzval, const char* key, uint klen, double value)`
`int add_assoc_string(zval* pzval, const char* key, const char* value)`
`int add_assoc_string_ex(zval* pzval, const char* key, uint klen, const char* value)`
`int add_assoc_stringl(zval* pzval, const char* key, const char* value, uint vlen, zend_bool duplicate)`
`int add_assoc_stringl_ex(zval* pzval, const char* key, uint klen, const char* value, uint vlen, zend_bool duplicate)`
`int add_assoc_zval(zval* pzval, const char* key, zval* value)`
`int add_assoc_zval_ex(zval* pzval, const char* key, uint klen, zval* value)`

> Note:

> add_*_string functions that accept a parameter named duplicate, will duplicate the string with `estrndup` when `duplicate` is true

> Note:

> add_*_zval functions do not adjust the refcount of the `value` parameter

To perform more advanced operations on array variables we must use the HashTable API directly.

Introduction to Variables
Working with HashTable
Working with Variables
PHP Manual