配列の扱い

配列は HashTable 構造体に格納され、zval の型は IS_ARRAY となります。ここでは、 これらの構造体を変数として作成したり破壊したり操作したりする API 関数について 説明します。これらの内容は Zend/zend_API.hでも確認できます。

変数としての HashTable の API
プロトタイプ 説明
void array_init(zval* pzval) 変数をHashTableとして初期化し、そのHashTable に対して型と適切なデストラクタ関数を設定する
void array_init_size(zval* pzval) 最小限size個の入れ物を用意して変数を array_init で初期化する

注意:

何度も array_destroy を呼び出さないようにしてください。変数の配列を破壊 するには、その変数に対してzval_ptr_dtorをコールします。その変数 へのその他の参照がなくなった時点で、自動的にその配列の中身も破壊されます。

インデックス配列用の API
プロトタイプ
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)
連想配列用 API
プロトタイプ
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)

注意:

duplicate という名前のパラメータを取る add_*_string 関数群は、duplicate が真の場合、estrndupを使って文字列を複製します。

注意:

add_*_zval 関数はvalueパラメータの参照カウントを調整しません。

配列変数に対してさらに高度な操作をしたい場合、直接 HashTable API を使う必要があります。