必须逐个判断类型再测长:strlen()仅支持字符串,对数组或非字符串元素会警告或返回错误结果;中文等多字节字符须用mb_strlen($v, 'UTF-8')并显式指定编码。
strlen() 遍历判断每个元素字符串长度PHP 数组里混着字符串、数字、null 或其他类型时,不能直接对整个数组调用 strlen()——它只接受字符串,传数组会警告「Array to string conversion」并返回 strlen("Array")(即 5)。必须逐个取值判断类型再测长。
常见错误写法: str 或 
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() 可以,但得自己兜底非字符串类型,否则出错或结果不可控。
0 表示非字符串(比返回 false 更利于后续计算)0
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() 没用。