如题,我在php扩展中定义了一个函数,这个函数需要传入php页面中的一个多维数组作为参数,然后在函数内部做计算。扩展函数是使用c语言写的,一维的情况我大概知道,是使用zval结构体,但是不知道咋解析出来。大家有谁知道,告诉我下啊?!非常感谢! 

解决方案 »

  1.   

    你完全可以看一个php自带的函数怎么完成的。
    以下摘自php-5.3.8\ext\standard\string.c文件,关于implode的
    PHP_FUNCTION(implode)
    {
    zval **arg1 = NULL, **arg2 = NULL, *delim, *arr; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|Z", &arg1, &arg2) == FAILURE) {
    return;
    }

    if (arg2 == NULL) {
    if (Z_TYPE_PP(arg1) != IS_ARRAY) {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument must be an array");
    return;
    } MAKE_STD_ZVAL(delim);
    #define _IMPL_EMPTY ""
    ZVAL_STRINGL(delim, _IMPL_EMPTY, sizeof(_IMPL_EMPTY) - 1, 0); SEPARATE_ZVAL(arg1);
    arr = *arg1;
    } else {
    if (Z_TYPE_PP(arg1) == IS_ARRAY) {
    arr = *arg1;
    convert_to_string_ex(arg2);
    delim = *arg2;
    } else if (Z_TYPE_PP(arg2) == IS_ARRAY) {
    arr = *arg2;
    convert_to_string_ex(arg1);
    delim = *arg1;
    } else {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid arguments passed");
    return;
    }
    }

    php_implode(delim, arr, return_value TSRMLS_CC); if (arg2 == NULL) {
    FREE_ZVAL(delim);
    }
    }其中是你想要的
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|Z", &arg1, &arg2) == FAILURE) {
    return;
    }看了上边代码,就会知道。implode可以使用一个参数,但必须是数组