php扩展:如何访问php数组

     在php扩展中,时常需要接受php类型的数组作为参数,php数组的参数都是zval类型的,并不适合在扩展中方便的使用,一般都要提前转换成c或cpp中的数据类型。首先看一个转换的例子:

void  convert_to_vector( const  zval  *  vals, vector < string >   & valList)  {
    
// create the list to write
    HashPosition         pos;
    zval               
**z_val = NULL;
    
string               value;

    zend_hash_internal_pointer_reset_ex( Z_ARRVAL_P( vals ), 
&pos );

    
while ( zend_hash_get_current_data_ex( Z_ARRVAL_P( vals ), (void **)&z_val, &pos ) == SUCCESS ) {
        convert_to_string_ex( z_val );
        value 
= Z_STRVAL_PP(z_val);

        valList.push_back(value);

        zend_hash_move_forward_ex( Z_ARRVAL_P( vals ), 
&pos );
    }

}

     上述列子是把php的数组转换成vector<string>的类型。HashPosition 是一个指针,通过 zend_hash_internal_pointer_reset_ex( Z_ARRVAL_P( vals ), &pos );方法使得pos指向zval数组的第一个元素,然后通过while循环中的 zend_hash_get_current_data_ex( Z_ARRVAL_P( vals ), (void **)&z_val, &pos ) 方法取得pos所指位置的元素值,保存在z_val指针中。
     
convert_to_string_ex( z_val ),转换z_val中包含的实际数据为字符串, value = Z_STRVAL_PP(z_val) 则获得此字符串的值,然后push_back到valList中。 zend_hash_move_forward_ex( Z_ARRVAL_P( vals ), &pos );则移动pos到下一个元素位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值