PHP解析Cassandra的map类型出现乱码,解决方案

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值