【问题标题】:PHP: Taking Array (CSV) And Intelligently Returning InformationPHP:获取数组(CSV)并智能返回信息
【发布时间】:2011-03-28 18:10:30
【问题描述】:

大家好。我是第一次发帖,但我已经浏览过这个网站很多次了。我有一个编码问题,我不确定如何解决。首先我会解释我需要做什么,我有什么信息,我希望有人能在正确的方向上给我一个提示。

我有一个电子表格 (CSV),其中包含以下信息:区域名称、邮政编码、城市名称。一个区域应该有许多城市属于它,并且每个城市很可能有许多邮政编码属于它。例如:

H区,92603,尔湾

H区,92604,尔湾

J 区,92625,电晕

等等

好的,现在已经不碍事了,这就是我需要对这些信息执行的操作。我需要能够输入一个城市名称并让它返回给我属于该城市的所有邮政编码,以及该城市所在的区域。例如,如果我输入 Chatsworth,它应该给我(Zone X) 和 (12345, 12346, 12347) 作为邮政编码(仅作为示例)。

我不确定解决此问题的最佳方法。我可以创建一个 MySQL 数据库并从那里工作,或者只使用 .csv 文件,或者将其硬编码到 PHP 文件中。我不知道如何在数组列中搜索一个值,然后相应地返回其他列(尤其是每个城市有多个邮政编码)。

如果有人可以帮助我,将不胜感激。另外,如果您需要我提供更多信息,请随时告诉我。提前感谢大家阅读。

【问题讨论】:

  • 在下面修复了我的代码,请参阅评论

标签: php arrays csv information-retrieval


【解决方案1】:

如果你想追求 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;
}

第一个返回匹配的 $rows 列表。我将由您决定如何确定哪一列包含哪一列。只有邮政编码才有可能确定性地返回结果。

【讨论】:

  • 谢谢,这似乎是朝着正确方向迈出的一步。但是假设我不知道这座城市在哪一排(恰好是这种情况)。我是否可以将 [] 中的数字替换为 $i,以便搜索当前行?我不知道这座城市在哪里,所以我必须寻找它。我需要的信息将与城市在同一行。但是,有些行具有相同的城市名称,但邮政编码不同。所以我需要获取不同行中的不同邮政编码,并将它们应用于该城市名称。也许我可以做一些类似 $zip .= $row[] 的事情。 ", ";?
  • @Kevin:反过来。要收集一系列邮政编码,您可以使用$zip[] = $row[1];。但是如果你不知道城市名称在哪一列,那么你可能不会提前知道哪一列包含数字邮政编码,对吧?搜索问题是可以解决的,但找到正确的结果是一件大事。
  • 你就不能foreach ($row as $key => $col) {if ($col == "Chatsworth") { /* $key is the index where the city is. */ }}吗?
  • @Bruno:是的。想一想$key = array_search("Chatsworth", $row); 也可能有用。
  • 我要试试这个。非常感谢你的帮助,我真诚地感谢它。
【解决方案2】:

H区,92603,尔湾

H区,92604,尔湾

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;
    }
}

最后你有一个这样的结果数组:

$results = array(
   array('Zone B', '12345', 'Searched'),
   array('Zone Z', '35145', 'Searched'),
   array('Zone Q', '12365', 'Searched'),
)

【讨论】:

  • 这究竟是如何回答 OP 的问题的?
  • @Brian 被那个炸了^_^
  • @Neal 我认为你没有抓住重点。您已经通过您的解决方案假设 OP 知道换行编码将是什么。如果不是这样呢?
  • @Brian -- 我添加了一条评论来说明这一事实
  • @Wiseguy,不需要,file_get_contents 也能满足他的需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多