PHP 扩展检查密钥是否存在

PHP extension check if key exist

我实际上是要编写一个扩展 php(写在 C 中)。有什么方法可以知道 assoc 数组中是否存在键?我使用 add_assoc_string 但如果密钥存在,此功能会删除数据。目前我这样做:

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 但我找不到示例。

编辑

我终于找到了解决方案,检查 zaval array 中是否存在密钥

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

您可以从这里 php-src 使用 zend_hash_index_exists(Z_ARRVAL_P(return_value))

array_ 开始的函数系列只是包装以简化 zend hash table API 的使用。查看array_init()的源代码。您会看到它在后台调用 zend_hash_init()。因此,只需在您的代码中使用适当的类型转换即可。

更多示例如何使用 phpinternalsbook 中的 arrays/hast 个表。 此外,您总是可以直接在 PHP 源代码 repo. For example for this particular case - 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,把"value"当成zend_long n,类型不匹配。