php判断数组元素字符串长度_php遍历数组测长度法【教程】

必须逐个判断类型再测长: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() 可以,但得自己兜底非字符串类型,否则出错或结果不可控。

  • 返回 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() 没用。