使用修订后的答案....
在PHP中,以十六进制字符串进行数学运算曾经是一项支持的功能。现在,在PHP 7中,十六进制字符串仅表示一个字符字符串,不再被认为包含数值。如果您尝试对其进行数学运算,则结果为零。请考虑以下代码:
<?php
$arr = [66, 233, 204, 205];
$res = array_reduce( $arr, function($c,$i) {
$c.=dechex( $i );
return $c;
});
$temp = "0x" . $res;
var_dump($temp + 0);
请看演示
该代码试图通过将0添加到$temp中的值来为十六进制字符串提供数学上下文。这段代码在PHP 7之前有效,因为有关部门确定十六进制字符串带来了比它们值得的更多问题;请参见此RFC和手册:{{link3:“十六进制字符串不再被认为是数字”}}。
连接作为一个字符串操作,创建了示例的十六进制字符串,其直接使用在数学运算中证明是不明智的。在PHP 7.1中会发出以下投诉:
注意:遇到非格式良好的数字值
您可以禁止显示此通知,但在PHP 7中,结果总是为零。当该代码在PHP 5.6中正确工作时,1122618573
的结果似乎是错误的,肯定太大而无法转换为浮点数并获得OP寻求的值。
...一个真正的解决方法
<?php
$arr = [66, 233, 204, 205];
$res = array_reduce( $arr, function($c,$i) {
$c.=dechex( $i );
return $c;
});
$temp = "0x" . $res;
$int = filter_var( $temp, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX );
if (false === $int) {
throw new Exception("Invalid integer!");
}
$arr = (unpack('f', pack('i', $int )));
$f = array_pop($arr);
printf("%.3f",$f);
查看 演示
如果您使用带有指定参数的 filter_var(),PHP 将识别 array_reduce() 产生的数字十六进制字符串。这样,您可以获得一个评估为 1122618573
的整数。关键不是整数的值,而是其二进制位模式。借鉴官方答案此处,代码需要将 $int 打包成二进制字符串,然后将其作为浮点数unpack -- 几乎。该结果将作为只有一个元素的数组返回。在弹出并捕获该元素的浮点值后,printf() 显示 116.900
。
implode();
进行附加,它会将其附加在字符串值中;这看起来像是66233204205
。 - Rayaaritoarray_map('dechex', $array)
,然后是implode()
,最后是hexdec()
。但我没有测试过,我认为对于更大的数字它会失败。 - jh17110x42E9CCC
字符串,没有意识到它并没有让我们更接近解决方案。至少编辑是在我的评论几分钟后 :) - jh1711