Суммируйте все значения, найденные в текстовом файле, и сохраните их, используя Array_count_values ​​в php

Ну, я новичок в PHP, поэтому я делал программу, которая считает слова из определенного текстового файла. Это мой текстовый файл:

Hello Hello Hello Hello
Hello Word array sum
Hello Find

Это мой код (php:

/*Open file*/
$handle = fopen($_FILES['file']['tmp_name'], 'r');

/*read all lines*/
while (! feof($handle)) {
$line = fgets($handle);

/*using array_count_values with str_word_count to count words*/
$result=       (array_count_values(str_word_count(strip_tags(strtoupper($line)), 1)));

/*sort array*/
arsort($result);

/*show the first ten positions and print array*/
$top10words2 = array_slice($result, 0, 10);
print "<pre>";
print_r ($top10words2);
print "</pre>";
}
fclose($handle);

но мой вывод такой:

Array{
[Hello] => 4
}
Array{
[Hello] => 1
[Word] => 1
[array] => 1
[sum] => 1
}
Array{
[Hello] => 1
[Find] => 1
}

Мне нужно, чтобы вывод был таким:

Array{
[Hello] => 6
[Word] => 1
[array] => 1
[sum] => 1
[find] => 1
}

Какие-нибудь советы?

3 ответа

Решение

Я согласен с file_get_contents() Ответ от beta-developper, однако для очень больших файлов, возможно, вам придется сделать это, как вы начали. Вы хотите построить массив слов в цикле, а затем посчитать, отсортировать и разрезать потом:

$result = array();
while(!feof($handle)) {
    $line = fgets($handle);
    $result = array_merge($result, str_word_count(strip_tags(strtoupper($line)), 1));
}
$result = array_count_values($result);
arsort($result);
$top10words2 = array_slice($result, 0, 10);

Использование file_get_contents вместо

$fileContent = file_get_contents($_FILES['file']['tmp_name']);
/* using array_count_values with str_word_count to count words */
$result = (array_count_values(str_word_count(strip_tags(strtoupper($fileContent)), 1)));
/* sort array */
arsort($result);
/* show the first ten positions and print array */
$top10words2 = array_slice($result, 0, 10);
print "<pre>";
print_r($top10words2);
print "</pre>";

Вот вывод:

Array
(
    [HELLO] => 6
    [FIND] => 1
    [SUM] => 1
    [ARRAY] => 1
    [WORD] => 1
)

Вы не делаете ничего, чтобы объединить количество слов, которое вы вычисляете в каждой строке. Установив $result = array_count_values(...) вы отменяете результаты предыдущего цикла. Кроме того, поскольку вы выполняете сплайсинг и дамп из цикла, вы никогда не воздействуете на полный набор результатов и, таким образом, никогда не получаете реального представления о том, какие из 10 самых популярных слов используются.

Ваш код нуждается в двух изменениях:

  1. Объедините счетчики из каждой строки в один массив.
  2. Подождите, пока вы закончите обработку файла, прежде чем смотреть на результаты.

С помощью file_get_contents() будет работать, но в зависимости от размера обрабатываемого файла, это может привести к ошибкам ограничения памяти. Решение, использующее ваш начальный метод, будет выглядеть так:

$results = [];
while (!feof($handle)) {
  $line = fgets($handle);
  $line_results = array_count_values(str_word_count(strip_tags(strtoupper($line)), 1));
  foreach ($line_results as $word => $count) {
    if (isset($results[$word])) {
      $results[$word] += $count;
    }
    else {
      $results[$word] = $count;
    }
  }
}

arsort($results);
// etc...
Другие вопросы по тегам