【问题标题】:How to search a CSV file and return multiple entries based on keyword input如何根据关键字输入搜索 CSV 文件并返回多个条目
【发布时间】:2021-02-15 11:50:17
【问题描述】:

您好,我有一个包含名称、扩展名和单元格的 CSV 文件。一些用户同时拥有分机号和手机号码。我正在尝试在我们的 Intranet 页面上创建搜索,用户将在其中输入关键字(名称、分机或单元格),然后返回其中包含关键字的所有结果。我使用 fgetcsv 读取了一个 CSV 文件,但我只能返回扩展名。如果我搜索姓名或手机号码,它将返回一个空白的白页。这是我的代码:

$value = $_POST["search"];
$file = 'phonelist/PhonelistCSV2.csv';
while (($data = fgetcsv($file)) !== FALSE){
    //print_r($data); - this was just a test to see the data printing out. It prints the entire CSV
    print_r(array_keys($data,$value));
}
fclose($file);

经过一整天的谷歌搜索并试图让它工作后,我放弃了 fgetcsv。现在我正在尝试使用 CSV 并将其编码为 JSON

$csv=file_get_contents($file); $array=array_map("str_getcsv", explode ("\n",$csv)); 
$json=json_encode($array);

我打印出 json 数组来验证内容是否与 csv 相同。我创建了一个 javascript 函数来搜索关键字。我只是出于测试目的将值放入 div 中进行测试,但我无法使该功能正常工作

$value = $_POST["search"];
$keyword=json_encode($value);
<script type="text/javascript">
function search(keyword){
return json.filter(({name, ext, cell}) => {
    return name.toLowerCase().indexOf(keyword.toLowerCase()) > -1 ||
           ext.toLowerCase().indexOf(keyword.toLowerCase()) > -1 ||
           cell.toLowerCase().indexOf(keyword.toLowerCase()) > -1 
})
}
document.getElementById('test').innerHTML = json; // I tried it this way and
alert(search($keyword);
</script>
<div id="test"></div>

长话短说,我需要一些帮助来创建对我的 Intranet 的搜索,以搜索包含姓名、分机号和手机号码的 CSV 办公室目录。到目前为止,在我尝试过的解决方案中,我只能返回分机号码。我希望它的功能类似于搜索“Tim”,返回所有名称中包含 Tim 的人及其后续扩展名、单元格 # 或两者。

【问题讨论】:

    标签: php csv fgetcsv


    【解决方案1】:

    您可以只对名称等内容进行不区分大小写的搜索,并相应地过滤您的记录。

    第一部分只是将 csv 数据放入一个数组中。

    <?php
    
    $data =<<<DATA
    Neil Buchanan,334,012345678
    Tony Hart,314,01234828828
    Henri Matisse,392,01234457575
    DATA;
    
    $data = array_map('str_getcsv', preg_split('/\R/',$data));
    
    $name_search = function($keyword) use ($data) {
        return array_filter($data, function($line) use ($keyword) {
            return stristr($line[0], $keyword);
        });
    };
    
    $results = $name_search('to');
    var_export($results);
    echo "Next Search\n";
    $results = $name_search('he');
    var_export($results);
    

    输出:

    array (
        1 => 
        array (
          0 => 'Tony Hart',
          1 => '314',
          2 => '01234828828',
        ),
      )Next Search
      array (
        2 => 
        array (
          0 => 'Henri Matisse',
          1 => '392',
          2 => '01234457575',
        ),
      )
    

    【讨论】:

    • 感谢您的帮助。我尝试使用您的代码,但是当我运行它时,它返回的只是array()。我首先使用 $value 的 post 值进行了尝试。然后我像你一样尝试并直接将字符输入到函数中。无论哪种方式,它都会返回 array()。
    • @SkylarP 也许您可以发布您的 csv 文件样本,或者在您从 csv 翻译后转储一些数据? var_export(array_slice($data, 0, 2));。您在搜索正确的列吗?
    • 您可以在此处看到具有不同输入数据的相同代码:3v4l.org/dRXev
    • 谢谢您,我能够定制您的代码以满足我的搜索需求。非常感谢您的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2013-02-26
    相关资源
    最近更新 更多