エクステンションでforeachを簡単に書くには: PHP6対応版

PHP6ではUnicode対応のためハッシュテーブルのキーなどで引数の型が char ** から zstr * になっており、以前のHASH_FOREACHマクロは使えませんでした。
今回のものはIS_UNICODEが定義されていればUnicode対応のHASH_FOREACHマクロを定義します。
hash_foreach.h (行数が増えたのでダウンロードできるようにしました)


ちなみにUnicode非対応版ではこうだったのが、

char *_kstr;
/* snip. */
switch (zend_hash_get_current_key_ex(a, &_kstr, &_klen, &_knum, 0, NULL)) {
  case HASH_KEY_IS_STRING:
	ZVAL_STRINGL(k, _kstr, _klen - 1, 0);
	break;
  case HASH_KEY_IS_LONG:
	ZVAL_LONG(k, (long)_knum);
	break;
  default:
	ZVAL_NULL(k);
}

Unicode対応版ではこうなりました。

zstr _kstr;
/* snip. */
switch (zend_hash_get_current_key_ex(a, &_kstr, &_klen, &_knum, 0, NULL)) {
  case HASH_KEY_IS_UNICODE:
	ZVAL_UNICODEL(k, _kstr.u, _klen - 1, 0);
	break;
  case HASH_KEY_IS_STRING:
	ZVAL_STRINGL(k, _kstr.s, _klen - 1, 0);
	break;
  case HASH_KEY_IS_LONG:
	ZVAL_LONG(k, (long)_knum);
	break;
  default:
	ZVAL_NULL(k);
}