2016-11-15 3 views
1

Я на самом деле должен кодировать расширение php (это wirte в C). Любой способ узнать, существует ли ключ в массиве? Я использую 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 

Возможно ли проверить, существует ли ключ1? Может быть, я могу использовать hashTable, но я не нашел примера.

EDIT

Я, наконец найти решение, чтобы проверить, если ключ существует в 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(). Поэтому просто используйте соответствующий тип в вашем коде.

Дополнительные примеры работы с массивами/таблицами hast в 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'. –