2012-08-06 4 views
6

Ich schreibe eine PHP-Erweiterung für meine C++ Bibliothek, die so etwas wie diese definiert ist:Wie konvertiert man Zval in Vektor für PHP-Erweiterung?

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

jetzt, ich bin ein PHP-Wrapper für obige Funktion wie diese zu schreiben.

ZEND_METHOD(myFInfo, get_pids) 
{ 
    zval *idsArray; 

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

jetzt will ich getPids() aufrufen, aber ich weiß nicht, die richtige Art und Weise idsArray als Vektor in die C++ Funktion zu übergeben.

nach einiger Suche im Web fand ich ein Beispiel wo zval Array iteriert wird, um jeden Wert zu lesen, und ich dachte, vielleicht kann ich dies verwenden, um einen Vektor zu erstellen.

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; 
    } 

aber ist dies der beste Ansatz? oder gibt es einen besseren Weg, dies zu tun?

danke!

Antwort

3

Um ein std::vector<std::string> aus einem PHP-Array zu füllen, ist hier, wie ich es tun würde (die kurze Version):

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)); 
} 

... wo arr Ihre Eingabe ist zval * und vec Ausgabevektor ist.

+0

danke. Das ist, was ich getan habe. Ich habe zuerst while-Schleife verwendet, aber for-Schleife reduziert mindestens 2 Zeilen, so ging ich mit for-Schleife. –

+0

@Prod Sie sollten diese Antwort akzeptieren, wenn das Problem durch Klicken auf das grüne Häkchen links neben der Antwort gelöst wurde. – nickb

Verwandte Themen