最近在项目中用到了一个支持多节点存储的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的无名大神,这里分享出来只为给其他遇到类似问题的朋友提供一点思路。