版本是php 5.2
1.一维数组:
//获取数据
zval **data;
HashTable *arr_hash;
HashPosition pointer;
int array_count;
arr_hash = Z_ARRVAL_P(uinlist);
for(
zend_hash_internal_pointer_reset_ex(arr_hash, &pointer);
zend_hash_get_current_data_ex(arr_hash, (void**) &data, &pointer) == SUCCESS;
zend_hash_move_forward_ex(arr_hash, &pointer)
)
{
zval temp;
char *key;
uint key_len;
ulong index;
//加入到protobuf中去
if (zend_hash_get_current_key_ex(arr_hash, &key, &key_len, &index, 0, &pointer) == HASH_KEY_IS_STRING)
{
//不处理
}
else
{
temp = **data;
zval_copy_ctor(&temp);
convert_to_string(&temp);
//Z_STRVAL(temp)
}
}
2.二维数组:
//获取输入的二维数组,包括tid 和 tidval
zval **data;
HashTable *arr_hash;
HashPosition pointer;
int array_count;
arr_hash = Z_ARRVAL_P(arr); //arr 是输入的二维数组
for(
zend_hash_internal_pointer_reset_ex(arr_hash, &pointer);
zend_hash_get_current_data_ex(arr_hash, (void**) &data, &pointer) == SUCCESS;
zend_hash_move_forward_ex(arr_hash, &pointer)
)
{
if(Z_TYPE_PP(data) == IS_ARRAY)
{
//处理二级数组
HashTable *arr_hash2;
HashPosition pointer2;
int array_count2;
arr_hash2 = Z_ARRVAL_P(*data);
array_count2 = zend_hash_num_elements(arr_hash2);
if(array_count2 < 2)
{
//不处理只有tid,没有tidval的item
continue;
}
zval **data2;
for(
zend_hash_internal_pointer_reset_ex(arr_hash2, &pointer2);
zend_hash_get_current_data_ex(arr_hash2, (void**) &data2, &pointer2) == SUCCESS;
zend_hash_move_forward_ex(arr_hash2, &pointer2)
)
{
zval temp;
char *key;
uint key_len;
ulong index;
SetUserInfoReq::TlvStruct * tmpTidVal = req.mutable_set_user_info_req()->add_tlvinfo();
//加入到protobuf中去
if (zend_hash_get_current_key_ex(arr_hash2, &key, &key_len, &index, 0, &pointer2) == HASH_KEY_IS_STRING)
{
temp = **data2;
zval_copy_ctor(&temp);
convert_to_string(&temp);
//获取数组的值 Z_STRVAL(temp)
PHPWRITE(Z_STRVAL(temp),strlen(Z_STRVAL(temp)));
}
else
{
temp = **data2;
zval_copy_ctor(&temp);
convert_to_string(&temp);
PHPWRITE(Z_STRVAL(temp),strlen(Z_STRVAL(temp)));
}
PHPWRITE(key, key_len);
zval_dtor(&temp);
}
}
}