首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP将位数组压缩为尽可能短的字符串

PHP将位数组压缩为尽可能短的字符串
EN

Stack Overflow用户
提问于 2013-02-22 19:32:00
回答 4查看 2.6K关注 0票数 2

我有一个数组,它包含值1或0,表示真或假值。例如:

代码语言:javascript
复制
array(1,0,0,1,0,1,1,1,1);

我想把这个数组压缩/编码成尽可能短的字符串,这样它就可以存储在空间受限的地方,比如cookie。它还需要能够在以后再次解码。我该怎么做呢?

ps。我在PHP中工作

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-22 19:39:28

以下是我的建议:

代码语言:javascript
复制
$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,以便能够将其保存为一个字符串。

更新

相反的很简单:

代码语言:javascript
复制
$original = str_split(implode('', array_map(function($i) {
    return decbin(ord($i));
}, str_split(base64_decode($compressed)))));

我到底是怎么写的(只是为了防止任何人对如何编写这种不可读和难以维护的代码感兴趣):

我已经编写了$original = $compressed;,并开始一步一步地反转这个表达式的右边部分:

将ASCII码从ASCII码解码成二进制字符串

  • 将其拆分为数组ASCII码的每个字符code

  • Converted十进制ASCII码拆分为数组所有二进制数都拆分为一个数组

  • 将长二进制字符串拆分为数组
票数 5
EN

Stack Overflow用户

发布于 2013-02-22 19:37:34

不要使用serialize。只需将其组成一个字符串:

代码语言:javascript
复制
<?php

$string = implode( '', $array );
?>

剩下的字符串如下:

代码语言:javascript
复制
100101111

如果您想要再次拥有一个数组,只需像访问数组一样访问它:

代码语言:javascript
复制
$string = '100101111';

echo $string[1]; // returns "0"

?>

当然,您也可以将其设置为小数并只存储数字。这甚至比“原始”部分更短。

代码语言:javascript
复制
<?php

$dec = bindec( $string );

?>
票数 0
EN

Stack Overflow用户

发布于 2013-02-22 21:25:12

packunpack怎么样?

代码语言:javascript
复制
$arr = array(1,1,1,1,0,0,1,1,0,1,0,0,1,1,0,0,1,1,1,1);
$str = implode($arr);
$res = pack("h*", $str);
var_dump($res);
$rev = unpack("h*", $res);
var_dump($rev);

输出:

代码语言:javascript
复制
string(10) # Not visible here
array(1) {
  [1]=>
  string(20) "11110011010011001111"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15023213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档