电话
400 9058 355
正确做法是先用(string)强转再测长度,负数需先abs();筛选3位数应使用strlen((string)abs($n))===3,而非直接strlen($n)。
strlen() 判断数字位数时要注意类型转换PHP 中数字本身没有“位数”概念,strlen() 只能作用于字符串。直接对整数调用会触发隐式转换,但遇到科学计数法(如 1e10)或浮点数(如 123.0)时结果不可靠。
正确做法是先用 (string) 强转,再测长度。注意负数带负号,如 -42 的 strlen 是 3,若只需纯数字位数,得先 abs()。
假设数组是 $nums = [5, 99, 100, 999, 1000, -123],要取「绝对值为 3 位数」的项:
array_filter($nums, fn($n) => strlen($n) === 3) —— 99 变成字符串是 "99",长度为 2;-123 是 "-123",长度为 4array_filter($nums, fn($n) => strlen((string) abs($n)) === 3)
array_filter($nums, fn($n) => is_numeric($n) && ctype_digit(ltrim((string) $n, '-')) && strlen(ltrim((string) $n, '-')) === 3)
如果数组很大或需多次筛选不同位数,反复 (string) + abs() + strlen() 会拖慢速度。可预处理成「数字 → 位数」映射:
$digitMap = array_map(fn($n) => is_numeric($n) ? strlen(ltrim((string) (int) $n, '-')) : 0, $nums); $threeDigitIndices = array_keys(array_filter($digitMap, fn($d) => $d === 3)); $result = array_intersect_key($nums, array_flip($threeDigitIndices));
这种写法把计算从 O(n×操作) 降为 O(n),适合批量位数判断。
有人倾向用 preg_match('/^\d{3}$/', $n),但该正则只匹配纯数字字符串,对整数或浮点数会失败;且无法处理带符号数。若坚持用正则,必须先格式化:
preg_match('/^\d{3}$/', ltrim((string) (int) $n, '-')) —— 仅适用于整数截断场景preg_match,因为 100.5、"100abc" 等输入会让逻辑失控真正容易被忽略的是:位数筛选常和业务语义耦合,比如「3 位数」在身份证号里可能是前三位,在价格里可能代表百元级——别只盯 strlen,先确认数值范围是否比位数更可靠(例如 $n
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...