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
,类型不匹配。
我实际上是要编写一个扩展 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
,类型不匹配。