2012-08-06 27 views
6

मैं अपने C++ पुस्तकालय के लिए एक PHP एक्सटेंशन जो कुछ इस तरह परिभाषित किया गया है लिख रहा हूँ: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 C++ समारोह में वेक्टर के रूप में पारित करने के लिए उचित तरीके से पता नहीं है।

वेब पर कुछ खोज के बाद, मुझे एक उदाहरण मिला जहां प्रत्येक मूल्य को पढ़ने के लिए ज़वाल सरणी को पुनरावृत्त किया जाता है, और मैंने सोचा कि शायद मैं इसे वेक्टर बनाने के लिए उपयोग कर सकता हूं।

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

लेकिन क्या यह सबसे अच्छा तरीका है? या ऐसा करने का एक बेहतर तरीका है?

धन्यवाद!

उत्तर

3

एक PHP सरणी से एक std::vector<std::string> भर दें, यहाँ मैं इसे कैसे (लघु संस्करण) कर करेंगे:

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

धन्यवाद। यही वह है जो मैं कर रहा था। मैंने पहली बार लूप के दौरान उपयोग किया, लेकिन लूप के लिए कम से कम 2 लाइनों को कम किया ताकि मैं लूप के साथ गया। –

+0

@Prod आपको जवाब के बाईं ओर हरे रंग की चेकमार्क पर क्लिक करके अपनी समस्या हल करने के लिए यह जवाब स्वीकार करना चाहिए। – nickb

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^