#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. спасибо, я смог адаптировать ваш код в соответствии с моими потребностями в поиске. очень ценю вашу помощь.