I'm sure most people would choose simplicity over better design and I'm not going to explain every detail on how I'd handle this. If you don't understand what I'm talking or don't want to make the extra effort to write this pseudo-code out then this solution probably isn't for you.
I'd compress this data before you POST. First take the checkboxes out of your form tag so they don't get posted (we'll be giving it out own data).
Second, when the user submits the form (now with just a button) run some JS which traverses your DOM and gathers all of your check data. It will need to create a long array and then it'll need to use a separate long to shift the active bit if the checkbox is selected only (start at 1 and double the value for each checkbox until it reaches >2147483647). I would stop at 31bits per group (even though JS uses 64bit longs; the shift ops don't work above 32; also, JS doesn't have unsigned variables so unless you want to deal with flipping the - sign while all of this is going on then that's out too).
Third, post that to the server in a hidden text field and on the server end you get to reverse all of this.
Fourth, decode this on the server.
Fifth: Do this all again in reverse if you need the checks to begin correctly setup.
Advantages of This:
- MUCH less data travels between client and server
- No need to modify php.ini or even .htaccess
- This is able to grow and shrink dynamically (no need to reconfigure anything if you add another 2000 checks)
- Some browsers have limits on the number of bytes\fields you can post so simply increasing the number of fields won't always help.
- IE has limits on the length of a URL so forget about GET with the other solution. MAYBE, you can do it with this.
Disadvantages:
- Much more difficult to implement (nearly everything will need to be done 2 times for client and server as well)
- Users may not have JS enabled
- JS needs a lot of help when it comes to bit shifting
- Uses more CPU time
--
If you want to take this up a notch then you'll want to work out a fix for the JS bit shift operator problem (this will nearly halve your data length): Converting javascript Integer to Byte array and back
This improved version will also require a 64bit PHP installation on the server (or a BigInt class which is WAY out of scope for this question).