Как выполнить поиск в CSV-файле и вернуть несколько записей на основе ввода ключевого слова

#php #csv #fgetcsv

#php #csv #fgetcsv

Вопрос:

Здравствуйте, у меня есть CSV-файл с именем, расширением и ячейкой. У некоторых пользователей есть как расширения, так и номер ячейки. Я пытаюсь создать поиск на нашей странице интрасети, где пользователь вводит ключевое слово (name, ext или cell), а затем возвращает все результаты, в которых есть ключевое слово. Я прочитал в файле CSV, используя fgetcsv, но смог вернуть только расширения. Если бы я искал имя или номер ячейки, он вернул бы пустую белую страницу. вот код, который у меня есть:

 $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 после целого дня поиска в Google и попыток заставить его работать. Теперь я пытаюсь взять 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>
  

короче говоря, мне нужна помощь в создании поиска в моей интрасети для поиска в каталоге CSV office с именами, добавочными номерами и номерами ячеек. до сих пор в решениях, которые я пробовал, я мог возвращать только добавочные номера. Я бы хотел, чтобы он функционировал как поиск «Tim», возвращал всех людей с именем Tim в их имени и их последующем расширении, ячейке # или обоих.

Ответ №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 Searchn";
$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',
    ),
  )
  

Комментарии:

1. Спасибо за вашу помощь. Я пытался использовать ваш код, но когда я его запустил, все, что он вернул, было array() . Сначала я попробовал использовать значение post из $value. затем я попробовал, как и вы, и ввел символы непосредственно в функцию. в любом случае он вернул array() .

2. @SkylarP возможно, вы могли бы опубликовать образец вашего csv-файла или сбросить некоторые из ваших данных, как только вы переведете их из csv? var_export(array_slice($data, 0, 2)); . Вы ищете правильный столбец?

3. Вы можете увидеть, что здесь работает один и тот же код с разными входными данными: 3v4l.org/dRXev

4. спасибо, я смог адаптировать ваш код в соответствии с моими потребностями в поиске. очень ценю вашу помощь.