Вы не спрашивали, если это была хорошая идея, - как предлагали многие, ваша выгода от такого рода пространства сжатия, легко теряется в дополнительной обработке - но это другая тема :)
Вы также не упоминая, где вы храните данные после. Независимо от того, какое место/механизм хранения может иметь дополнительные условия и специализированные типы (например, база данных имеет формат двоичного столбца, может иметь формат столбца в байте, может даже поддерживать хранение бит и т. Д.).
Но, придерживаясь темы, я думаю, что наилучшее 3-х битное хранилище - это как кусок (понемногу один бит), и я полагаю, я бы объединил два куска в байт (потеряв два бита в целом). Да вы потерять два бита (если это ключ), но это просто, чтобы объединить эти два значения, так что вы обработки накладных расходов является относительно небольшим:
$byte=$val1*7+$val2;
$val2=$byte%7;$val1=($byte-$val2)/7;
Если байт не доступен, вы можете объединить эти до 16 (4 сохраненных), 32 (8), 64 (16) битовых целых числа. Вы можете также сформировать массив этих значений для более крупного хранилища.
я считаю выше более читаемым человеком, но вы также можете использовать битовую логику для объединения и разделения значений:
$combinedbyte=$val1<<3|$val2;
$val2=$combinedbyte&7;$val1=($combinedbyte&56)>>3);
(Это эффективно, что Упаковать/Распаковать команды делают)
В качестве альтернативы вы можете кодировать символы, поскольку в ASCII первые несколько из них защищены, вы можете начать с A (A-Z + 6 punc + az дает вам 58, когда вам нужно всего лишь 49, чтобы сохранить ваши два значения).
$char=chr(($val1*7+$val2)+65); //ord('A')=65
$val2=(ord($char)-65)%7;$val1=(ord($char)-65-$val2)/7;
Ряд этих закодированных символов может быть сохранен как массив или строка с нулевым завершением.
ПРИМЕЧАНИЕ: В случае -say-64-битных целых чисел выше, мы сохраняем 3 бита в 4, поэтому получаем 64/4 = 16 мест хранения. Это означает, что мы откладываем еще 16 бит (1 за место), поэтому у вас может возникнуть соблазн добавить еще 5 значений, в общей сложности 21 (21 * 3 = 63 бит, только 1 потрачено впустую). Это, безусловно, возможно (с целочисленной математикой, хотя большинство экземпляров PHP не работают 64 бита или бит-логические решения), но это усложняет ситуацию в конечном итоге - вероятно, больше проблем, чем того стоит.
Вы не можете «хранить» вещи на PHP. Вы говорите об их сжатии в памяти во время работы с ними? Будете ли вы загружать их из базы данных? – meagar
Да, я говорю о сжатии их в памяти, чтобы отправить их на мой механизм хранения, что бы это ни было. – analogue