赞
踩
最近在项目中用到了一个支持多节点存储的nosql数据库Cassandra,由于采集的是服务器运行信息,后端程序在数据入库时,大量使用了map类型。然而我们知道PHP这门语言是不支持map类型的,所以在从socket中获取到数据时,PHP会自动按字符串(string)类型去解析。然后对于大部分map类型的数据,解析出来的结果都会出现乱码,并且难以直接进行处理
如下图:
找了很多Cassandra的PHP类库都没有解决,最后在Stackoverflow上看到某位大神使用PHP进行位运算,从而解决数据类型不兼容的方法。引入过来稍作修改之后,问题解决,成功将被PHP解析为string的map数据,转化为array。
下面附上将map转化为array的代码(可直接使用)
- private function cql3_map_to_array($map){
- $byte_array = unpack('C*', $map);
- $map_array = array();
-
- if(sizeof($byte_array) > 2) {
- $pos = 1;
- $size = (intval($byte_array[$pos]) * 256) + intval($byte_array[$pos + 1]);
- $pos += 2;
-
- while($size > 0){
- $length = (intval($byte_array[$pos]) * 256) + intval($byte_array[$pos + 1]);
- $pos += 2;
- $key = substr($map, $pos - 1, $length);
- $pos += $length;
-
- $length = (intval($byte_array[$pos]) * 256) + intval($byte_array[$pos + 1]);
- $pos += 2;
- $value = substr($map, $pos - 1, $length);
- $pos += $length;
-
- $map_array[$key] = $value;
-
- $size--;
- }
- }
-
- return $map_array;
- }
再次感谢stackoverflow那位提供demo的无名大神,这里分享出来只为给其他遇到类似问题的朋友提供一点思路。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。