int64_t f_count(CVarRef var, bool recursive /* = false */) { switch (var.getType()) { case KindOfUninit: case KindOfNull: return 0; case KindOfObject: { Object obj = var.toObject(); if (obj->isCollection()) { return obj->getCollectionSize(); } if (obj.instanceof(SystemLib::s_CountableClass)) { return obj->o_invoke_few_args(s_count, 0).toInt64(); } } break; case KindOfArray: if (recursive) { CArrRef arr_var = var.toCArrRef(); return php_count_recursive(arr_var); } return var.getArrayData()->size(); default: break; } return 1; }
static int php_count_recursive(CArrRef array) { long cnt = array.size(); for (ArrayIter iter(array); iter; ++iter) { Variant value = iter.second(); if (value.isArray()) { CArrRef arr_value = value.asCArrRef(); cnt += php_count_recursive(arr_value); } } return cnt; }