php - 如何将 zval 转换为 vector 以用于 php 扩展?

标签 php c++ php-extension php-internals

我正在为我的 c++ 库编写一个 php 扩展,它的定义如下:

bool getPids(map<string,string> pidsMap, vector<string> ids);

现在,我正在为上述功能编写一个 php 包装器。

ZEND_METHOD(myFInfo, get_pids)
{
    zval *idsArray;

    if (zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "a",
                                &idsArray ) == FAILURE )
    {
        RETURN_NULL();
    }
}

现在我想调用 getPids(),但我不知道将 idsArray 作为 vector 传递给 C++ 函数的正确方法。

在网上搜索后,我找到了一个示例,其中迭代 zval 数组以读取每个值,我想也许我可以使用它来创建一个 vector 。

PHP_FUNCTION(hello_array_strings)
{
    zval *arr, **data;
    HashTable *arr_hash;
    HashPosition pointer;
    int array_count;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arr) == FAILURE) {
        RETURN_NULL();
    }

arr_hash = Z_ARRVAL_P(arr);
array_count = zend_hash_num_elements(arr_hash);

php_printf("The array passed contains %d elements", array_count);

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_STRING) {
                PHPWRITE(Z_STRVAL_PP(data), Z_STRLEN_PP(data));
                php_printf("
    ");
            }
        }
        RETURN_TRUE;
    }

但这是最好的方法吗?或者有更好的方法吗?

谢谢!

最佳答案

填充 std::vector<std::string>从 PHP 数组中,我会这样做(简短版本):

std::vector<std::string> vec;
HashTable *arr_hash = Z_ARRVAL_P(arr);
zval **arr_value;
for(zend_hash_internal_pointer_reset(arr_hash);
    zend_hash_get_current_data(arr_hash, (void **)&arr_value) == SUCCESS;
    zend_hash_move_forward(arr_hash))
{
    vec.push_back(Z_STRVAL_PP(arr_value));
}

...哪里arr是你的输入 zval * , 和 vec是你的输出 vector 。

关于php - 如何将 zval 转换为 vector 以用于 php 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834078/

相关文章:

c - 包装方法在 'false' block 中结束,但直接函数调用不会

php - 如何使用调试、TS 为 PHP 5.3.6 编译 php 扩展

php - ZF1 的 quoteInto() 方法在 ZF2 中的等价物是什么?

php - 如何禁用在 Laravel Jetstream 中为新注册用户创建新团队的功能?

php - 将 WordPress 中的下拉列表或文本字段中的值传递到functions.php 中的 MySQL 查询

c++ - Qt - 编译时错误 2

使用 libtidy 的 PHP 扩展编译,但不加载

php - 是否可以使用 DOMDocument 查询前 5 个图像?

c++ - 结构数组初始化

c++ - 如何在 Visual Studio 2013 中重新编译 .lib