diff --git a/src/array.c b/src/array.c
index 633031b02dd6143f80f73b930313260ba9858c8b..b809ee7d284b9c591ca6f6d525ceff5dbfc0fc11 100644
--- a/src/array.c
+++ b/src/array.c
@@ -175,6 +175,18 @@ PMOD_EXPORT void do_free_array(struct array *a)
     free_array(a);
 }
 
+/**
+ *  Free all elements in an array and set them to zero.
+ */
+PMOD_EXPORT void clear_array(struct array *a)
+{
+  if (!a->size) return;
+  free_svalues(ITEM(a), a->size, a->type_field);
+  /* NB: We know that INT_T == 0. */
+  MEMSET(ITEM(a), 0, a->size * sizeof(struct svalue));
+  a->type_field = BIT_INT;
+}
+
 /**
  *  Set the flags on an array. If the array is empty then only the
  *  weak flag is significant.
diff --git a/src/array.h b/src/array.h
index 6e820bc3d229c39bb7920ad2ecb817fe14049e81..090757a039302a4bb3b6b703f42610950af76d0e 100644
--- a/src/array.h
+++ b/src/array.h
@@ -112,6 +112,7 @@ typedef short_cmpfun (*cmpfun_getter)(TYPE_T);
 PMOD_EXPORT struct array *real_allocate_array(ptrdiff_t size, ptrdiff_t extra_space);
 PMOD_EXPORT void really_free_array(struct array *v);
 PMOD_EXPORT void do_free_array(struct array *a);
+PMOD_EXPORT void clear_array(struct array *a);
 PMOD_EXPORT struct array *array_set_flags(struct array *a, int flags);
 PMOD_EXPORT void array_index(struct svalue *s,struct array *v,INT32 ind);
 PMOD_EXPORT struct array *array_column (struct array *data, struct svalue *index,