PHP将比特数组压缩成最短的字符串

Chr*_*ris 2 php compression arrays encoding

我有一个数组包含值1或0表示真或假值.例如

array(1,0,0,1,0,1,1,1,1);
Run Code Online (Sandbox Code Playgroud)

我想将此数组压缩/编码为可能的最短字符串,以便它可以存储在空间受限的位置,例如cookie.它还需要能够在以后再次解码.我该怎么做?

PS.我在PHP工作

zer*_*kms 5

这是我的建议:

$a = array(1,0,0,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1);

$compressed = base64_encode(implode('', array_map(function($i) {
    return chr(bindec(implode('', $i)));
}, array_chunk($a, 8))));

var_dump($compressed); // string(8) "l8vlBw=="
Run Code Online (Sandbox Code Playgroud)

所以你得到每个8个字符(实际上是二进制0..255),将它们转换为整数,表示为ASCII字符,将其内嵌到字符串并转换为base64以便能够将其保存为字符串.

UPD:

相反的是非常简单:

$original = str_split(implode('', array_map(function($i) {
    return decbin(ord($i));
}, str_split(base64_decode($compressed)))));
Run Code Online (Sandbox Code Playgroud)

我是怎么写的(以防万一有人如何编写这样难以理解且几乎无法维护的代码):

我写了$original = $compressed;并开始逐步颠倒这个表达式的右边部分:

  1. 从base64解码为二进制字符串
  2. 将其拆分为数组
  3. 将每个字符转换为ASCII码
  4. 将十进制ASCII码转换为二进制
  5. 将所有二进制数加入一个二进制数
  6. 将长二进制字符串拆分为数组