🎃

【PHP 拡張】二次元配列を返す関数を実装する

2024/05/03に公開

次のような二次元配列のデータを返す関数を 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