PHP调用array_intersect出现数组转字符串警告该如何解决?
错误原因
- 你对
$name变量的初始化操作错误:preg_grep()返回的本身就是存储匹配结果的一维数组,你使用array_push($name, $out)会把整个结果数组作为单个元素塞入$name,导致$name变成二维数组。后续preg_grep()、array_intersect()处理数组元素时,遇到子数组就会触发「Array to string conversion」警告。 - 正则格式不规范:
preg_grep()要求正则表达式必须包裹在合法分隔符中,你当前的写法存在解析异常风险。 - 额外隐患:
file()默认会保留每行末尾的换行符,可能影响字符串匹配结果。
修复后可直接运行的代码
<?php $keys = 'aed'; // 读取文件时去掉每行末尾的换行符,避免匹配干扰 $database = file('database.txt', FILE_IGNORE_NEW_LINES); $k = str_split($keys); $length = count($k); // 第一次匹配结果直接赋值,保证$name始终是一维字符串数组 $name = preg_grep("/{$k[0]}/", $database); for($x = 1; $x < $length; $x++) { $j = $k[$x]; // 在上一轮筛选结果中,匹配包含当前字符的人名 $out = preg_grep("/{$j}/", $name); // 直接用新的筛选结果更新$name即可,等价于取交集 $name = $out; } echo '<pre>'; var_dump($name); echo '</pre>'; ?>
核心修改说明
- 移除了错误的
array_push操作,第一次匹配结果直接赋值给$name,保证变量始终是一维字符串数组,从根源解决类型转换报错 - 正则统一使用
/作为分隔符,符合PHP正则规范 file()新增FILE_IGNORE_NEW_LINES参数,移除行尾换行符避免匹配异常- 简化了循环内的逻辑:因为
preg_grep本身就是在上一轮结果中筛选符合条件的元素,结果本身就是两者的交集,不需要额外调用array_intersect
内容的提问来源于stack exchange,提问作者sediea
相关产品推荐
相关产品推荐

