以下代码适用于提供的数组。
$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开头的数字是八进制数:
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);
}
然后差异就OK了:
print_r(array_diff($newArr, $arr));
Array
(
[2] => 003
[3] => 004
[5] => 006
[7] => 008
[8] => 009
[9] => 010
)
在 PHP7 上测试
参考:
您的前导零使数字变成八进制。