読者です 読者をやめる 読者になる 読者になる

unpack()が1はじまりの配列を返す

$ php -r 'var_dump(unpack("C*", "ABC"));'
array(3) {
  [1]=>
  int(65)
  [2]=>
  int(66)
  [3]=>
  int(67)
}

何でだろうと思ってソースを見てみたらこんなコードを見つけた。
(ext/standard/pack.c)

            if (arg != 1 || namelen == 0) {
                /* Need to add element number to name */
                snprintf(n, sizeof(n), "%.*s%d", namelen, name, i + 1);
            } else {
                /* Truncate name to next format code or end of string */
                snprintf(n, sizeof(n), "%.*s", namelen, name);
            }

このi + 1がそれっぽいが、何のために1足してるんだろう。というかソース見るまで忘れてたけど、PHPのunpackは連想配列を返すんだった。

$ php -r 'var_dump(unpack("C*hoge", "ABC"));'
array(3) {
  ["hoge1"]=>
  int(65)
  ["hoge2"]=>
  int(66)
  ["hoge3"]=>
  int(67)
}

そうか。この"hoge1","hoge2","hoge3"の"hoge"の部分が無くなったから1,2,3になるのか。