PHP:获取数组(CSV)并智能地返回信息
大家好。我是第一次登海报,但我已经浏览过这个网站很多次了。我有一个编码问题,我不知道该怎么解决。首先,我会解释我需要做什么,我有什么信息,我希望有人能给我一个正确的方向推动 我拥有的是一个电子表格(CSV),它包含以下信息:区域名称、邮政编码、城市名称。一个区域应该有许多城市,每个城市很可能都有许多邮政编码。例如: 欧文92603号H区 欧文92604号H区 J区,92625,科罗纳 等等 好了,现在这已经不成问题了,我需要对这些信息做些什么。我需要能够输入一个城市名称,并让它返回给我所有的邮政编码,属于该城市,以及该城市所在的区域。例如,如果我输入Chatsworth,它应该给我(Zone X)和(123451234612347)作为邮政编码(只是一个示例) 我不知道最好的办法是什么。我可以创建一个MySQL数据库并从那里开始工作,或者从.csv文件开始工作,或者将其硬编码到PHP文件中。我不知道如何在数组列中搜索一个值,然后相应地返回其他列(尤其是每个城市有多个邮政编码) 如果有人能帮助我,我将不胜感激。另外,如果您需要我提供更多信息,请随时通知我。提前感谢大家的阅读 欧文92603号H区 欧文92604号H区 J区,92625,科罗纳 等等 您可以获取该文件并获取其所有内容。然后按新行将其拆分:PHP:获取数组(CSV)并智能地返回信息,php,arrays,csv,information-retrieval,Php,Arrays,Csv,Information Retrieval,大家好。我是第一次登海报,但我已经浏览过这个网站很多次了。我有一个编码问题,我不知道该怎么解决。首先,我会解释我需要做什么,我有什么信息,我希望有人能给我一个正确的方向推动 我拥有的是一个电子表格(CSV),它包含以下信息:区域名称、邮政编码、城市名称。一个区域应该有许多城市,每个城市很可能都有许多邮政编码。例如: 欧文92603号H区 欧文92604号H区 J区,92625,科罗纳 等等 好了,现在这已经不成问题了,我需要对这些信息做些什么。我需要能够输入一个城市名称,并让它返回给我所有的邮政
$searchCity = 'Searched'; //or whatever city you are looking for
$file = file_get_contents('file.csv');
$results = array();
$lines = explode("\n",$file);
//use any line delim as the 1st param,
//im deciding on \n but idk how your file is encoded
foreach($lines as $line){
//split the line
$col = explode(",",$line);
//and you know city is the 3rd element
if(trim($col[2]) == $searchCity){
$results[] = $col;
}
}
在最后,u有一个结果数组,如下所示:
$results = array(
array('Zone B', '12345', 'Searched'),
array('Zone Z', '35145', 'Searched'),
array('Zone Q', '12365', 'Searched'),
)
如果要采用CSV方法,则第一步是将文件读入二维数组:
$csv = array_map("str_getcsv", file("file.csv"));
现在这是一个索引数组,您需要知道哪个列是哪个列。但是,如果您知道城市总是在[2]
中,那么搜索其他信息就变得很简单:
foreach ($csv as $i=>$row) {
if ($row[2] == "Chatsworth") {
$zone = $row[0];
$zip = $row[1];
break;
}
}
理想情况下,您可以将其放入函数中,以便可以多次调用它。如果您可以配置要搜索的列,并让它返回找到的完整行,那么这将是最简单的
好的,如果你不知道$city名称在哪里,那么我建议使用以下实用函数:
function search_csv($city) {
global $csv; // pre-parsed array (can be parameter though)
foreach ($csv as $i=>$row) {
if (in_array($city, $row)) {
$result_rows[] = $row;
}
}
return $result_rows;
}
function search_zip($city) {
$rows = search_csv($city);
foreach ($rows as $i=>$row) {
$rows[$i] = end(array_filter($row, "is_numeric"));
}
return $rows;
}
第一个返回匹配的$行列表。我将让您决定如何找出哪个列包含哪个。只有对于邮政编码,才有可能确定地返回结果。这究竟是如何回答OP的问题的?@Brian,所以我想你没有抓住重点。您的解决方案假设OP知道换行编码是什么。“如果不是这样呢?”布赖恩——我加了一句话来说明这一点fact@Wiseguy,这不是必需的,
file\u get\u contents
对他所需要的东西同样有效。谢谢,这似乎是朝着正确的方向迈出的一步。。但假设我不知道城市在哪一排(碰巧是这样)。我会用$I替换[]中的数字,以便它搜索当前行吗?我不知道城市在哪里,所以我必须寻找它。我需要的信息将与城市的信息放在同一行。但是,有些行具有相同的城市名称,但邮政编码不同。因此,我需要获取不同行中的不同邮政编码,并将其应用于该cityname。也许我可以做一些像$zip.=$row[]这样的事情。", ";?@凯文:反过来。要收集邮政编码数组,可以使用$zip[]=$row[1]代码>。但是如果你不知道城市名称在哪一列,那么你可能不会事先知道哪一列包含数字邮政编码,对吗?搜索问题可以解决,但找到正确的结果是一件难事。难道你不能只做foreach($key=>row$col){if($col==“Chatsworth”){/*$key是城市所在的索引。*/}
?@Bruno:True。想想看,$key=array\u search(“Chatsworth”,$row)代码>可能也有用。我要试试这个。。非常感谢您的帮助,我衷心感谢。修复了下面的代码,请参阅评论