🎃
【PHP 拡張】二次元配列を返す関数を実装する
次のような二次元配列のデータを返す関数を PHP エクステンションで実装してみる
php -dextension=modules/hello.so test.php
test.php
<?php
$headers = [
[":scheme", "https"],
[":authority", "example.org"],
[":path", "/"],
["user-agent", "libnghttp2"],
["accept-encoding", "gzip, deflate"]
];
var_dump($headers === test());
C 言語のコードは次のとおり。構造体の配列をつくり、for ループで zval に登録する。配列に配列を登録するのに add_next_index_zval
を使う
/* {{{ array test() */
PHP_FUNCTION(test)
{
ZEND_PARSE_PARAMETERS_NONE();
typedef struct {
uint8_t *name;
uint8_t *value;
} header;
header nva[5];
nva[0] = (header) { ":scheme", "https" };
nva[1] = (header) { ":authority", "example.org" };
nva[2] = (header) { ":path", "/" };
nva[3] = (header) { "user-agent", "libnghttp2" };
nva[4] = (header) { "accept-encoding", "gzip, deflate" };
zval ret;
zval arr;
array_init(&ret);
for (int i = 0; i < 5; ++i) {
array_init(&arr);
add_index_string(&arr, 0, nva[i].name);
add_index_string(&arr, 1, nva[i].value);
add_next_index_zval(&ret, &arr);
}
RETURN_ZVAL(&ret, 0, 0);
}
/* }}}*/
Discussion