2016-11-15 105 views
1

我實際上是爲擴展php編寫代碼(它在C中是wirte)。任何方式來知道關聯數組中是否存在關鍵字?我使用add_assoc_string,但是如果密鑰存在,此功能將擦除數據。目前我這樣做:PHP擴展檢查是否存在密鑰

array_init(return_value); 

add_index_long(return_value, "key1", "value", 1); 
add_index_long(return_value, "key2", "value6", 1); 
add_index_long(return_value, "key1", "value2", 1); //here I erase previous key1 by value2 

是否有可能檢查key1例如是否存在?也許我可以使用hashTable但我找不到任何示例。

編輯

我已經finaly找到解決方案,以檢查是否鑰匙zaval array存在我做

if(zend_hash_exists(Z_ARRVAL_P(return_value), "key", sizeof("key"))){ 
    //key exist 
} 
+0

錯字:「ckeck」 - >「check」 – Vasif

回答

1

您可以使用zend_hash_index_exists(Z_ARRVAL_P(return_value))從這裏php-src

array_開始的函數族只是簡化了zend hash table API的使用的包裝。看看array_init()的源代碼。你會發現在底下它叫zend_hash_init()。所以只需在代碼中使用適當的類型轉換。

更多示例如何在phpinternalsbook中使用陣列/哈斯表。 另外你總是可以直接在PHP源代碼repo中找到很多有用的例子。例如對於這個特定的情況 - here

PS:此外,它看起來像這樣的代碼是不工作:

... 
add_index_long(return_value, "key1", "value", 1); 

因爲真正的簽名是add_index_long(zval *arg, zend_ulong idx, zend_long n),因此不能使用「KEY1」爲zend_ulong idx和「價值」爲zend_long n因類型不匹配。

+0

沒錯,但我很難用'hashTable'創建一個多維數組,因爲'zend_hash_index_exists()'第一個參數是'hashTable',在我的情況下'return_value'不是'hashTable'我相信@Ivan Velichko – simon

+0

只要看一下'array_init()'的源代碼。你將會看到,它調用'zend_hash_init()'。所以只要你在代碼中適當的類型轉換。請參見附加的'soap'擴展中的使用示例。 –