Ese comportamiento es normal ya que los campos tipo checkbox solo son enviados cuando se seleccionan.
Una técnica consiste en crear campos fantasma antes de los reales, los campos fantasma tendrían los valores por defecto en caso de no marcar ningún checkbox.
Código HTML:
<input type="hidden" name="foo[0]">
<input type="hidden" name="foo[1]">
<input type="hidden" name="foo[2]">
<input type="checkbox" name="foo[0]">
<input type="checkbox" name="foo[1]">
<input type="checkbox" name="foo[2]">
En caso de seleccionar un checkbox sobre-escribe el valor del campo fantasma, que claro, para que esto funcione debes enumerar los índices correctamente.