Суммируйте все значения, найденные в текстовом файле, и сохраните их, используя 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 самых популярных слов используются.
Ваш код нуждается в двух изменениях:
- Объедините счетчики из каждой строки в один массив.
- Подождите, пока вы закончите обработку файла, прежде чем смотреть на результаты.
С помощью 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...