版本是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); } } }