我正在写一个代码在php中我在传递一个数字到一个函数。但在函数中,我猜它默认转换为其他基数。请找到下面的代码。
<?php
function generate_alpha_num_id($x){
echo $x;
}
generate_alpha_num_id(010100001);
?>
理想情况下,我的输出应该是10100001.但代码输出是2129921。
我很难理解为什么会这样。任何帮助都很有用。 提前谢谢。
答案 0 :(得分:0)
因为您的数字以0开头,所以它在PHP中被解释为使用基本8(八进制)系统。
答案 1 :(得分:0)
来自PHP Manual:
要使用八进制表示法,请在数字前面加上0(零)。要使用十六进制表示法,请在数字前面加上0x。要使用二进制表示法,请在数字前加上0b。
PHP认为通过将您的号码转换为八进制值来帮助您。这是解决问题的方法:
代码:(Demo)
function generate_alpha_num_id($x){
return 0+$x; // add zero to convert strings to integers (effectively trimming leading zeros)
}
echo generate_alpha_num_id(010100001); // send parameter as 2129921 base 8 (octal)
echo "\n---\n";
echo generate_alpha_num_id('010100001'); // send parameter as string to avoid octal interpretation
输出:
2129921
---
10100001
在第一个函数调用中,将零和八进制数加在一起以生成未更改的八进制和。
在第二个函数调用中,将零和字符串类型的数字相加。 PHP将字符串计算为整数并将其添加到零,生成总和有效地删除了前导零。
来自PHP Manual:
在数值上下文中计算字符串时,结果值和类型确定如下。
如果字符串不包含任何字符'。','e'或'E',并且数值适合整数类型限制(由PHP_INT_MAX定义),则字符串将被计算为整数。在所有其他情况下,它将被评估为浮动。
要提供更多方法来解决问题,请考虑以下变体:
function generate_alpha_num_id($x){
var_export(0+$x);
echo "\n---\n";
var_export((int)$x);
echo "\n---\n";
var_export((integer)$x);
echo "\n---\n";
var_export(1*$x);
echo "\n---\n";
var_export(intval($x));
echo "\n---\n";
}
generate_alpha_num_id('010100001'); // send parameter as string to avoid octal interpretation
输出:
10100001
---
10100001
---
10100001
---
10100001
---
10100001
---