以下代码适用于提供的数组。
$arr1 = array(1,2,4,6,7,9,13,15);
$arr2 = range(1,max($arr1));
$missing = array_diff($arr2,$arr1);
foreach ($missing as $key => $val) {
echo $val;
echo ",";
}
但如果我将$ arr1更改为包含001,002,004,006,007,009,013,015,则会显示此输出:003,005,008,009,010,012,
我通过将它放在foreach循环中来格式化输出:
$val = str_pad($val, 3, "0", STR_PAD_LEFT);
我无法弄清楚为什么宣布009缺失;为什么它没有声明丢失011和014;以及用逗号结尾的原因。
有没有办法重写代码,以便正确处理数组?
答案 0 :(得分:2)
这是因为从0开始的数字是八进制数:
http://php.net/manual/pl/language.types.integer.php
要解决此问题,您可以将值作为字符串存储在原始数组中:
$arr = ['001', '002', '005', '011', '007'];
然后
echo max($arr); //011
仍然找到合适的,现在只是:
for ($i=1; $i<=ltrim(max($arr), '0'); $i++) {
$newArr[] = str_pad($i, 3, '0', STR_PAD_LEFT);
}
然后差异就可以了:
print_r(array_diff($newArr, $arr));
Array
(
[2] => 003
[3] => 004
[5] => 006
[7] => 008
[8] => 009
[9] => 010
)
在PHP7上测试
参考:
答案 1 :(得分:0)
您的前导零使数字成为八进制。