Как мне найти слова из определенного числа? - PullRequest
1 голос
/ 21 февраля 2020

Привет, ребята. У меня небольшой вопрос, предполагающий, что у меня есть строка как

"Здравствуйте, меня зовут XYZ"

Теперь я знаю, что могу найти длину слов как "Здравствуйте "имеет 5 символов и" My "имеет 2 символа. Используя следующий код

$text = file_get_contents('text.txt'); // $text = 'Hello my name is XYZ';
$words = str_word_count($text, 1);
$wordsLength = array_map(
function($word) { return mb_strlen($word, 'UTF-8'); },
$words
);

var_dump(array_combine($words, $wordsLength));

Но что, если я хочу найти, что количество слов с длиной 1 равно 0. Количество слов с длиной 2 равно 2. Количество слов с длиной 3 равно 1 и так далее до числа длиной 10

Примечание. Я рассматриваю длину слова до появления пробела. Предположим, в данных есть дата, например 20.04.2016, поэтому она должна показывать, что число - это слова с длина 10 равна 1.

и еще одна вещь, как найти среднюю длину слов в строке. Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Если вы используете array_count_values() в массиве $wordsLength, это даст счетчик длины строки. Если вы используете это и массив шаблонов (созданный с использованием array_fill()) с элементами 1-10 и значением 0. Вы получите список всех подсчетов слов ...

$counts = array_replace(array_fill(1, 9, 0), 
             array_count_values($wordsLength));

даст ...

Array
(
    [1] => 0
    [2] => 2
    [3] => 1
    [4] => 1
    [5] => 1
    [6] => 0
    [7] => 0
    [8] => 0
    [9] => 0
)
1 голос
/ 22 февраля 2020

Привет, попробуйте это работает на дату и специальные символы, смайлики

enter image description here

$text = 'Hello 20.04.2016  ? my   face?face  is XYZ';

$words =preg_split('/\s+/', $text);

$wordsLength = array_map(
function($word) { return mb_strlen($word, 'UTF-8'); }  ,$words);

print_r($words);

//Get Average word Length
$avg=round(array_sum($wordsLength)/count($words),1);
//print Avg
print($avg);

?>
0 голосов
/ 22 февраля 2020

( Демо )

$text = '    Hello 20.04.2016  ? my   incredibleness face?face  is XYZ    ';

Создание массива непрерывных видимых символов

$words = preg_split('/\s+/', $text, 0, PREG_SPLIT_NO_EMPTY);
array (
  0 => 'Hello',
  1 => '20.04.2016',
  2 => '?',
  3 => 'my',
  4 => 'incredibleness',
  5 => 'face?face',
  6 => 'is',
  7 => 'XYZ',
)

Замена видимых строк их многобайтовой длиной обратите внимание на более простой синтаксис

$wordsLength = array_map('mb_strlen', $words);
array (
  0 => 5,
  1 => 10,
  2 => 1,
  3 => 2,
  4 => 14,
  5 => 9,
  6 => 2,
  7 => 3,
)

Длина групп и счетчиков

$lengthCounts = array_count_values($wordsLength);
array (
  5 => 1,
  10 => 1,
  1 => 1,
  2 => 2,
  14 => 1,
  9 => 1,
  3 => 1,
)

Establi sh массив значений по умолчанию, поскольку $lengthCounts может иметь пробелы

$defaultCounts = array_fill_keys(range(1,10), 0);
array (
  1 => 0,
  2 => 0,
  3 => 0,
  4 => 0,
  5 => 0,
  6 => 0,
  7 => 0,
  8 => 0,
  9 => 0,
  10 => 0,
)

Отфильтруйте счетчики, чтобы удалить элементы / счетчики, выходящие за пределы диапазона

$filteredCounts = array_intersect_key($lengthCounts, $defaultCounts);
array (
  5 => 1,
  10 => 1,
  1 => 1,
  2 => 2,
  9 => 1,
  3 => 1,
)

Перезаписать значения по умолчанию найденными счетчиками, чтобы предотвратить пропуски в выходных данных

$gaplessCounts = array_replace($defaultCounts, $filteredCounts);
array (
  1 => 1,
  2 => 2,
  3 => 1,
  4 => 0,
  5 => 1,
  6 => 0,
  7 => 0,
  8 => 0,
  9 => 1,
  10 => 1,
)
...