PHP:如何通过颜色值从CSV格式文本行数组获取对应物品?
问题描述
我有一个每行采用CSV格式的文本文件,内容示例如下:
apple, green, fruit banana, yellow, fruit carrot, orange, vegetable
我希望根据输入的颜色值获取对应的物品名称,例如输入green返回apple,输入yellow返回banana。
目前我使用$array = file($file_path);读取文件,得到的数组如下:
Array ( [0] => apple, green, fruit [1] => banana, yellow, fruit [2] => carrot, orange, vegetable )
我尝试用以下代码查找:
$input = 'green'; $result = array_search($input, array_column($array, '1', '0')); // 期望返回apple
但$result返回空值,请问是否需要将CSV转换为二维数组,或是有其他解决方法?谢谢。
解决方法
问题核心在于:file()读取的数组元素是完整的CSV行字符串,并非二维数组,array_column()无法直接提取指定列的数据,必须先将每行字符串解析为子数组,再进行查找。
方法一:转换为二维数组并构建映射表
先把每行CSV字符串分割成子数组,再构建「颜色→物品」的映射数组,后续查找效率更高:
$file_path = 'your_file.csv'; $lines = file($file_path); $colorToItem = []; foreach ($lines as $line) { // 去除行尾换行符,按逗号分割后清理每个元素的空格 $parts = array_map('trim', explode(',', trim($line))); // 索引1对应颜色,索引0对应物品名称 $colorToItem[$parts[1]] = $parts[0]; } // 执行查找 $input = 'green'; $result = $colorToItem[$input] ?? '未找到匹配项'; echo $result; // 输出apple
方法二:直接遍历原数组查找
如果文件数据量较小,也可以直接遍历每行字符串匹配,无需提前构建映射:
$file_path = 'your_file.csv'; $lines = file($file_path); $input = 'green'; $result = null; foreach ($lines as $line) { $parts = array_map('trim', explode(',', trim($line))); if ($parts[1] === $input) { $result = $parts[0]; break; // 找到后立即终止循环 } } echo $result ?? '未找到匹配项'; // 输出apple
进阶优化:使用标准CSV解析函数
如果CSV格式存在特殊情况(比如字段包含逗号),建议用PHP内置的fgetcsv()处理,它能正确解析标准CSV格式:
$file_path = 'your_file.csv'; $colorToItem = []; $handle = fopen($file_path, 'r'); while (($row = fgetcsv($handle)) !== false) { $parts = array_map('trim', $row); $colorToItem[$parts[1]] = $parts[0]; } fclose($handle); // 查找示例 $input = 'yellow'; echo $colorToItem[$input] ?? '未找到'; // 输出banana
内容的提问来源于stack exchange,提问作者Jay Williams
相关产品推荐
相关产品推荐

