我正在尝试将C函数应用于HashTable
中zend_hash_apply_with_arguments
的每个元素。为此,我的C函数需要具有与apply_func_args_t
匹配的签名。最后一个参数必须是zend_hash_key
,它是一个包含整数和字符串的结构。如何判断我应该检查哪些字段以获取密钥?
答案 0 :(得分:2)
我不知道Zend,但我一直在挖掘源代码(PHP 5.5.14)。我在zend_hash.c中找到了以下功能,可能会对您有所帮助,也可能不会对您有所帮助:
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
{
Bucket *p;
/* ... */
if (p->nKeyLength) {
return HASH_KEY_IS_STRING;
} else {
return HASH_KEY_IS_LONG;
}
/* ... */
在zend_hash_apply_with_arguments()
中,您会发现hash_key.nKeyLength
设置为Bucket->nKeyLength
:
ZEND_API void zend_hash_apply_with_arguments(/* ... */)
{
Bucket *p;
/* ... */
Zend_hash_key hash_key;
/* ... */
hash_key.nKeyLength = p->nKeyLength;
/* ... */
}
因此,据推测,您可以通过检查zend_hash.nKeyLength
来区分这些类型。你是否应该
答案 1 :(得分:0)
在PHP7中,zend_hash_key
结构已更改为:
typedef struct _zend_hash_key {
zend_ulong h; // numeric key
zend_string *key; // string key
} zend_hash_key;
您可以在PHP源代码中看到Zend/zend_hash.c
并搜索以下内容:
if (p->key) { // p is a Bucket and assign to the zend_hash_key struct
return HASH_KEY_IS_STRING;
} else {
return HASH_KEY_IS_LONG;
}
答案 2 :(得分:-2)
确定变量是否是php中的字符串或数字 试试这样的事情
<?php
$a = "123456";
if (gettype($a)=="string" ){ echo $a," is a string<br>";}
$a = 123456;
if (gettype($a)=="integer" ){ echo $a," is an integer<br>";}
?>