我有一个数组,它包含值1或0,表示真或假值。例如:
array(1,0,0,1,0,1,1,1,1);
我想把这个数组压缩/编码成尽可能短的字符串,这样它就可以存储在空间受限的地方,比如cookie。它还需要能够在以后再次解码。我该怎么做呢?
ps。我在PHP中工作
发布于 2013-02-22 19:39:28
以下是我的建议:
$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=="
因此,您获取每个8个字符(实际上是一个二进制ASCII码),将它们转换为一个整数,表示为一个
0..255
字符,将其内爆为一个字符串,然后转换为base64,以便能够将其保存为一个字符串。
更新
相反的很简单:
$original = str_split(implode('', array_map(function($i) {
return decbin(ord($i));
}, str_split(base64_decode($compressed)))));
我到底是怎么写的(只是为了防止任何人对如何编写这种不可读和难以维护的代码感兴趣):
我已经编写了
$original = $compressed;
,并开始一步一步地反转这个表达式的右边部分:
将ASCII码从ASCII码解码成二进制字符串
发布于 2013-02-22 19:37:34
不要使用serialize。只需将其组成一个字符串:
<?php
$string = implode( '', $array );
?>
剩下的字符串如下:
100101111
如果您想要再次拥有一个数组,只需像访问数组一样访问它:
$string = '100101111';
echo $string[1]; // returns "0"
?>
当然,您也可以将其设置为小数并只存储数字。这甚至比“原始”部分更短。
<?php
$dec = bindec( $string );
?>
![]() |
个性的土豆 · 冥帝-哔哩哔哩_Bilibili 1 年前 |