如何判断zend_hash_key是整数还是字符串?

时间:2014-08-15 21:54:52

标签: php c php-extension

我正在尝试将C函数应用于HashTablezend_hash_apply_with_arguments的每个元素。为此,我的C函数需要具有与apply_func_args_t匹配的签名。最后一个参数必须是zend_hash_key,它是一个包含整数和字符串的结构。如何判断我应该检查哪些字段以获取密钥?

3 个答案:

答案 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来区分这些类型。你是否应该认为在Zend内部之外做这件事?我不知道。

答案 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>";}
?>