- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在为我的 c++ 库编写一个 php 扩展,它的定义如下:
bool getPids(map<string,string> pidsMap, vector<string> ids);
现在,我正在为上述功能编写一个 php 包装器。
ZEND_METHOD(myFInfo, get_pids)
{
zval *idsArray;
if (zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "a",
&idsArray ) == FAILURE )
{
RETURN_NULL();
}
}
现在我想调用 getPids(),但我不知道将 idsArray 作为 vector 传递给 C++ 函数的正确方法。
在网上搜索后,我找到了一个示例,其中迭代 zval 数组以读取每个值,我想也许我可以使用它来创建一个 vector 。
PHP_FUNCTION(hello_array_strings)
{
zval *arr, **data;
HashTable *arr_hash;
HashPosition pointer;
int array_count;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arr) == FAILURE) {
RETURN_NULL();
}
arr_hash = Z_ARRVAL_P(arr);
array_count = zend_hash_num_elements(arr_hash);
php_printf("The array passed contains %d elements", array_count);
for(zend_hash_internal_pointer_reset_ex(arr_hash, &pointer); zend_hash_get_current_data_ex(arr_hash, (void**) &data, &pointer) == SUCCESS;
zend_hash_move_forward_ex(arr_hash, &pointer)) {
if (Z_TYPE_PP(data) == IS_STRING) {
PHPWRITE(Z_STRVAL_PP(data), Z_STRLEN_PP(data));
php_printf("
");
}
}
RETURN_TRUE;
}
但这是最好的方法吗?或者有更好的方法吗?
谢谢!
最佳答案
填充 std::vector<std::string>
从 PHP 数组中,我会这样做(简短版本):
std::vector<std::string> vec;
HashTable *arr_hash = Z_ARRVAL_P(arr);
zval **arr_value;
for(zend_hash_internal_pointer_reset(arr_hash);
zend_hash_get_current_data(arr_hash, (void **)&arr_value) == SUCCESS;
zend_hash_move_forward(arr_hash))
{
vec.push_back(Z_STRVAL_PP(arr_value));
}
...哪里arr
是你的输入 zval *
, 和 vec
是你的输出 vector 。
关于php - 如何将 zval 转换为 vector 以用于 php 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834078/
我正在尝试使用 Eclipse 和 CDT 开发 PHP 扩展,但扩展代码被报告为充满语法错误和警告。我通过告诉 CDT 查找 PHP include 设法摆脱了其中的一部分。目录和 main PHP
我试图在我的扩展中创建一个新函数,它接受一个 array 作为参数,向 that 数组的相同实例添加一个条目并再次返回该实例。 到目前为止,这是代码: PHP_FUNCTION(make_array)
我正在转储一个在 PHP 版本 7.3.5 上运行的 zval 容器(opcache 已激活并且 PHP 已启用线程安全),遵循此给定代码:
我有: PHP_METHOD(Car, cls_ref) { Car *car; //Car2 *obj11; Car2 *car2; zval* obj11;
我正在读这个:http://www.dereleased.com/2011/04/27/the-importance-of-zvals-and-circular-references/ 还有一个例子让
我想将 Zval 转换为 char*。我如何在我的 php 扩展中做到这一点? 最佳答案 如果 zval 代表一个字符串,你可以使用 Z_STRVAL(或者 Z_STRVAL_P/Z_STRVAL_P
你能给我推荐一些实际的例子来说明如何使用 zval 容器吗?我知道的唯一相关函数是 debug_zval_dump,但我从未真正使用过它。 编辑: 我想,通过跟踪 zval 容器,我可以了解如何优化代
最近在查阅 PHP7 垃圾回收的资料的时候,网上的一些代码示例在本地环境下运行时出现了不同的结果,使我一度非常迷惑。 仔细一想不难发现问题所在:这些文章大多是 PHP5.x 时代的,而 PHP7 发
我正在研究 PHP 中内存管理的基础知识,我发现它真的很有趣。不幸的是,内存管理的内部结构似乎根据 PHP 版本发生了变化,所以我并不总是理解 xdebug_debug_zval 返回的结果。 ,与解
如果 zval 是一个可调用对象,我如何在我的扩展 C 代码中运行它? 或者如何将 zval 转换为 zend_fcall_info 最佳答案 搜索 zend_is_callable 并深入了解 ph
如何释放使用以下代码创建的变量? zval *zval_ = nullptr; MAKE_STD_ZVAL(zval_); ZVAL_NULL(zval_); 最佳答案 PHP 具有垃圾回收内存管理。
我正在为我的 c++ 库编写一个 php 扩展,它的定义如下: bool getPids(map pidsMap, vector ids); 现在,我正在为上述功能编写一个 php 包装器。 ZEND
我是一名优秀的程序员,十分优秀!