Из массива ищите значение и его соответствующий ключ в текстовом файле на PHP - PullRequest
1 голос
/ 06 января 2012

У меня есть большой текстовый файл (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().

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

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

Ответы [ 2 ]

1 голос
/ 06 января 2012

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

<?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;
?>
0 голосов
/ 06 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...