2012-08-06 11 views
6

私はこのような何かを定義している私のC++ライブラリのPHP拡張を書いています。PHP拡張モジュールのzvalをベクトルに変換するには?私はこのような上記の機能のためのPHPラッパーを書いて、今</p> <pre><code>bool getPids(map<string,string> pidsMap, vector<string> ids); </code></pre> <p>:

ZEND_METHOD(myFInfo, get_pids) 
{ 
    zval *idsArray; 

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

は、今私はgetPids()を呼び出したいが、私はC++関数へのベクターとしてidsArrayを渡すために適切な方法を知りません。

ウェブ上で検索した後、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::string>を移入する

答えて

3

は、ここで私はそれ(ショートバージョン)を行うだろう方法は次のとおりです。

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があなたの出力ベクトルです。

+0

ありがとうございました。それが私がやったことです。私は最初にループを使っていましたが、forループは少なくとも2行減らしましたので、forループと一緒に行きました。 –

+0

@Prod答えの左側にある緑のチェックマークをクリックして問題を解決した場合は、この回答を受け入れる必要があります。 – nickb

関連する問題

 関連する問題