多くの人が示唆しているように、この種のスペース圧縮の利点は、追加の処理で簡単に失われるので、それが良いアイデアかどうかは尋ねませんでしたが、それは別のトピックです:)
また、後でデータを保存する場所についても言及していません。そのストレージの場所/エンジンが何であれ、さらに条件や特殊なタイプがある可能性があります(たとえば、データベースにはバイナリ列形式、バイト列形式、ビットストレージなどがサポートされている場合があります)。
しかし、このトピックに固執すると、最良の3ビットストレージはニブル(1ビットをウエスト)として使用することであり、2つのニブルを1バイトに結合する(全体で2ビットを失う)と思います。はい、2ビットを失っています(それが重要な場合)が、2つの値を組み合わせるのは簡単なので、処理のオーバーヘッドは比較的小さくなります。
$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);
(これは事実上、PACK / UNPACKコマンドが行うことです)
または、ASCIIで最初のいくつかが保護されているため、文字にエンコードすることもできます(A-Z + 6 punc + azは、2つの値を格納するために49が必要な場合に58を提供します)。
$char=chr(($val1*7+$val2)+65); //ord('A')=65
$val2=(ord($char)-65)%7;$val1=(ord($char)-65-$val2)/7;
これらのエンコードされた一連の文字は、配列として、またはnullで終了する文字列として格納できます。
注:上記の-say- 64ビット整数の場合、3ビットを4に格納しているため、64/4=16の格納場所を取得します。これは、さらに16ビット(場所ごとに1ビット)を無駄にしていることを意味するため、さらに5つの値を追加して、合計21ビット(21 * 3 = 63ビット、1つだけが無駄になります)になりたくなるかもしれません。それは確かに可能です(整数演算では-ほとんどのPHPインスタンスは64ビットまたはビットロジックソリューションでは機能しませんが)、長期的には事態を複雑にします-おそらくそれが価値があるよりも多くの問題があります。