如何在PHP中将八进制值转换为字符串?

3

我的一个web服务返回的值是八进制(010),我想将这个值作为数组的键。

$key = 010;
$a[$key] = 'test';
print_r($a);

结果:

Array
(
    [8] => test
)

预期结果:

Array
(
    [010] => test
)

即使我进行类型转换,PHP也会将010值转换为9。我尝试了 (string) $keysprintf('%s', $key) 但都没有成功。

有没有办法将八进制转换为字符串而不改变其值?


你可以编写一个函数,将原始的八进制数作为字面字符串保留格式。八进制 - 来自维基百科上有一些关于如何表示八进制字面量的有用信息。使用小写字母'o'作为前缀会非常清晰易读,并且明显表明它是一个八进制数。而且将其转换回八进制数也很容易,当作为字符串键时,在使用PHP时它会被保持不变。 - Ryan Vincent
2个回答

2
$key = sprintf('%o', $key);

请参考http://docs.php.net/manual/zh/function.sprintf.php,但请注意,此时您的键不再是整数,而是字符串。
编辑:不确定您是否希望始终打印前导0。
$key = sprintf('0%o', $key);

或者始终获取一个有三位数字的键

$key = sprintf('%03o', $key);

1
它返回的是10而不是010。 - Logan

0
在PHP(以及基本上所有其他语言)中,这些类型的声明是允许的,但在编译/解析时总是转换为十进制整数(内部二进制)。因此,当脚本运行时,$key将始终为8。如果您想将八进制值用作键,您需要一个将数字格式化为其他进制(表示为字符串)的函数。
$num = 8;
$key = $num === 0 ? '0' : '0' . decoct(8); // works for all numbers 0 and up
$a[$key] = 'test';
print_r($a);

1
它返回的是10而不是010。 - Logan
1
不错的发现。你需要明确地添加一个0来使它按照你想要的方式工作。在八进制数中,唯一需要零的原因是为了解析器能够明确地知道你的意思。更新的答案(注意:这对除了零以外的所有情况都适用,零将变成'00')。 - Anonymous
我有可能得到像0010、00020、00001、00012131等这样的数字。我想要一个解决方案来处理所有前导零。 - Logan
但是前导零没有意义。01等同于0000001。PHP应该如何知道如何为您格式化数字呢?唯一的解决方案是提前从所有键中去除零以进行规范化。 - Anonymous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接