Из массива найдите значение и соответствующий ему ключ в текстовом файле в PHP

57
4

У меня есть размерный txt файл (3,5 МБ), структурированный так:

sweep#1 expanse#1   0.375
loftiness#1 highness#2 0.375
lockstep#1 0.25
laziness#2 0.25
treponema#1 0.25
rhizopodan#1 rhizopod#1 0.25
plumy#3 feathery#3 feathered#1 -0.125
ruffled#2 frilly#1 frilled#1 -0.125
fringed#2 -0.125
inflamed#3 -0.125
inlaid#1 -0.125

За каждым словом следует #, целое число, а затем его "оценка". Между словом и счетом есть перерывы между вкладками. На данный момент текстовый файл загружается как строка с помощью file_get_contents().

Из массива строк, состоящих из отдельных, строчных, разделенных символом слов, мне нужно найти каждое значение, найти его соответствующий балл и добавить его в текущее количество.

Я предполагаю, что мне понадобится какая-то форма регулярного выражения, чтобы сначала найти слово, перейдите к следующему \t а затем добавьте целое число в общее число. Какой лучший способ сделать это?

спросил(а) 2012-01-06T02:16:00+04:00 8 лет, 9 месяцев назад
1
Решение
57

Да, есть, вероятно, лучшие способы сделать это. Но это так о-о-просто:

<?php

$wordlist = file_get_contents("wordlist.txt");

//string string of invalid chars and make it lowercase
$string = "This is the best sentence ever! Winning!";
$string = strtolower($string);
$string = preg_replace('/[^\w\d_ -]/si', '', $string);
$words = explode(" ", $string);

$lines = explode("\n", $wordlist);
$scores = array();
foreach ($lines as $line) {
$split = preg_split("/(\#|\t)/", $line); //split on # or tab
$scores[$split[0]] = doubleval(array_pop($split));
//split[0] (first element) contains the word
//array_pop (last element) contains score
}

$total = 0;
foreach($words as $word) {
if (isset($scores[$word])) $total += $scores[$word];
}

echo $total;
?>

ответил(а) 2012-01-06T02:30:00+04:00 8 лет, 9 месяцев назад
41

Если вам просто нужно найти слово, то это просто:

preg_match("/^$word#\d+\t+(\d+\.\d+)/m", $textfile, $match);
$sum += floatval($match[1]);

^ ищет начало строки в режиме /m, а # и \t - литеральные разделители, а \d+ десятичные числа. Группа результатов [1] будет вашим плавающим числом.

$word требует экранирования (preg_quote), может ли он потенциально содержать / переднюю косую черту. Чтобы $word1|$word2|$word3 поиск нескольких слов за один раз, имплантируйте их как альтернативный список $word1|$word2|$word3, добавьте группу захвата и вместо этого используйте preg_match_all.

ответил(а) 2012-01-06T02:37:00+04:00 8 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема