Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将zval转换为php扩展的向量? 我正在为我的C++库编写一个PHP扩展,它定义了这样的东西: bool getPids(map<string,string> pidsMap, vector<string> ids); 现在我想调用GETPIDSH(),但是我不知道将IDSARORT作为向量传递到C++函数的正确方法。_Php_C++_Php Extension_Php Internals - Fatal编程技术网

如何将zval转换为php扩展的向量? 我正在为我的C++库编写一个PHP扩展,它定义了这样的东西: bool getPids(map<string,string> pidsMap, vector<string> ids); 现在我想调用GETPIDSH(),但是我不知道将IDSARORT作为向量传递到C++函数的正确方法。

如何将zval转换为php扩展的向量? 我正在为我的C++库编写一个PHP扩展,它定义了这样的东西: bool getPids(map<string,string> pidsMap, vector<string> ids); 现在我想调用GETPIDSH(),但是我不知道将IDSARORT作为向量传递到C++函数的正确方法。,php,c++,php-extension,php-internals,Php,C++,Php Extension,Php Internals,在网上搜索之后,我发现了一个例子,其中zval数组被迭代读取每个值,我想也许我可以用它来创建一个向量 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", &a

在网上搜索之后,我发现了一个例子,其中zval数组被迭代读取每个值,我想也许我可以用它来创建一个向量

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;
    }
但这是最好的办法吗?还是有更好的方法


谢谢

要从PHP数组填充
std::vector
,以下是我的方法(简短版本):

std::向量向量向量机;
哈希表*arr_hash=Z_ARRVAL_P(arr);
zval**arr_值;
用于(zend_hash_internal_pointer_reset(arr_hash));
zend_hash_get_current_data(arr_hash,(void**)和arr_value)=成功;
zend_hash_move_forward(arr_hash))
{
向量推回(Z_STRVAL_PP(arr_值));
}

…其中
arr
是您的输入
zval*
,而
vec
是您的输出向量。

谢谢。这就是我最后做的。我第一次使用while循环,但for循环至少减少了2行,所以我使用for循环。@Prod如果通过单击答案左侧的绿色复选标记解决了问题,您应该接受此答案。
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> 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));
}