必须逐个判断类型再测长:strlen()仅支持字符串,对数组或非字符串元素会警告或返回错误结果;中文等多字节字符须用mb_strlen($v, 'UTF-8')并显式指定编码。

用 strlen() 遍历判断每个元素字符串长度
PHP 数组里混着字符串、数字、null 或其他类型时,不能直接对整个数组调用 strlen()——它只接受字符串,传数组会警告「Array to string conversion」并返回 strlen("Array")(即 5)。必须逐个取值判断类型再测长。
常见错误写法:strlen($arr) 或 array_map('strlen', $arr)(后者在含非字符串元素时会报 Warning 并返回 false)。
正确做法是先用 is_string() 过滤,再测长:
foreach ($arr as $item) {
if (is_string($item)) {
$len = strlen($item);
echo "字符串 '{$item}' 长度:{$len}\n";
}
}
array_map() + 匿名函数安全测长
想一行生成长度数组?array_map() 可以,但得自己兜底非字符串类型,否则出错或结果不可控。
立即学习“PHP免费学习笔记(深入)”;
- 返回
0表示非字符串(比返回false更利于后续计算) - 用三元运算避免 Warning:对非字符串统一返回
0 - 注意:PHP 8+ 中
strlen(null)会抛TypeError,所以必须提前判断
示例:
$lengths = array_map(function($v) {
return is_string($v) ? strlen($v) : 0;
}, $arr);
中文等多字节字符要用 mb_strlen()
如果数组里有中文、日文或 emoji,strlen() 返回的是字节数,不是字符数。比如 "你好" 的 strlen() 是 6(UTF-8 下每个汉字占 3 字节),而 mb_strlen("你好", 'UTF-8') 才是 2。
关键点:
- 不指定编码时,
mb_strlen()依赖mb_internal_encoding()设置,线上环境可能不一致 - 建议显式传
'UTF-8',尤其在 CLI 和 Web 环境混用时 - 若不确定输入编码,先用
mb_detect_encoding()探测(但该函数不可靠,慎用)
安全写法:
$lengths = array_map(function($v) {
return is_string($v) ? mb_strlen($v, 'UTF-8') : 0;
}, $arr);
性能敏感场景别在循环里重复调用 mb_internal_encoding()
有人会在匿名函数里每次调用 mb_internal_encoding('UTF-8') 来“确保编码”,这反而拖慢速度——该函数是全局设置,且频繁调用无意义。
真正要做的只有两件:
- 在脚本开头统一设好:
mb_internal_encoding('UTF-8'); - 所有
mb_*函数显式传编码参数,不依赖内部编码 - 避免在循环中做任何函数调用以外的逻辑,比如文件读取、数据库查询
复杂点在于:你得确认整个数据流从输入($_POST、JSON 解码、DB 查询)到输出全程编码一致。否则光修 mb_strlen() 没用。











