[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как получить количество элементов одинаковой длины
baston
Есть массив слов. Есть переменная, содержащая количество символов в каждом слове из массива.
Нужно подсчитать количество слов с одинаковым количеством символов.
Туплю все утро и не могу даже алгоритм действий составить...
Подскажите, если не трудно (не код, а алгоритм).

P.S. Уточню задачу и ее состояние.
Вот так я получаю длину каждого слова в массиве.
function countchars($val)
{
$cc = mb_strlen($val, 'utf-8'); //Получаем длину каждого элемента в массиве
echo "Слово \"$val\" состоит из $cc символа(ов)";
}
reset($words);
array_walk($words, "countchars");

Предположу, что надо сравнивать каждую длину каждого слова в массиве. Но как это сделать в той же функции countchars?



Спустя 13 минут, 20 секунд (27.02.2010 - 12:57) John_761 написал(а):
$i;

foreach($array as $a)
if(strlen($a) == $num)
$i++;

Переменная, содержащая количество символов в каждом слове из массива - это массив или она как-то меняет свое значение по ходу?
Тогда сделать 2 вложенных цикла for, 1й по элементам массива слов, 2й по элементам длин, и сравнивать на каждом шаге

Спустя 4 минуты, 18 секунд (27.02.2010 - 13:01) baston написал(а):
Цитата (John_761 @ 27.02.2010 - 12:57)
Переменная, содержащая количество символов в каждом слове из массива - это массив или она как-то меняет свое значение по ходу?

Это статическая переменная - не массив.

Спустя 20 минут, 30 секунд (27.02.2010 - 13:21) John_761 написал(а):
Я бы сделал так:
Прошелся по всему массиву слов и создал бы массив длин этих слов
Потом удалил бы одинаковые значения из 2го или взял бы уникальные значения, что бы не считать одни и те же слова несколько раз
И в 2х циклах for сравнивал длину каждого элемента 1го массива со значением из 2го

Спустя 9 минут, 15 секунд (27.02.2010 - 13:31) baston написал(а):
Спасибо. Буду думать.

Спустя 2 часа, 39 минут (27.02.2010 - 16:10) baston написал(а):
Нет, никак не могу подключить логику...
Даже если ваш алгоритм правилен, то удалив повторяющиеся значения из массива с длинами слов из массива слов мы не подсчитаем количество однообуквенных, двухбуквенных и т.д. слов.

Имею массив слов. Имею массив длин. И что с ними делать - не соображу. А с вложенными циклами у меня вообще беда. Не работает логика.

Спустя 38 минут, 38 секунд (27.02.2010 - 16:48) baston написал(а):
Вот, предположим, у меня есть такой цикл:
foreach($words as $val)
{
for($i=0; $i<count($val); $i++)
{
if(mb_strlen($val) == 1) $cnt++;
}

}

$words - это массив слов.
Этим циклом я могу показать только количество для однобуквенных слов.
Как сделать, чтобы можно было проверить все слова в цикле, и вывести количество (от 1 до 10-буквенных слов)?

Спустя 46 минут, 46 секунд (27.02.2010 - 17:35) John_761 написал(а):
Как-то так, оказалось проще, чем я предполагал smile.gif можно обойтись и без вложенного цикла
На выходе получаем двумерный массив, в котором элементы отсортированы по длине
<?php
$words = array('a', 'ab', 'ab', 'a', 'abc', 'abc', 'abc');
$charlen = array();
$result = array();

foreach($words as $w)

if(!in_array(strlen($w), $charlen))

$charlen[] = strlen($w);

//print_r($charlen);

for($i = 0; $i < count($words); $i++)
{
$length = strlen($words[$i]);

if(in_array($length, $charlen))

$result[$length][] = $words[$i];
}
print_r($result);
?>

Спустя 26 минут, 49 секунд (27.02.2010 - 18:02) John_761 написал(а):
Так вывожу подробно

foreach($result as $key => $r)
{
echo 'Длина '.$key.' символов:<br/>'.'Элементов '.count($result[$key]).'<br/>';

print_r($result[$key]);

echo '<br/>';
}

Что-то не так... biggrin.gif
Все понял, англ шрифт считает нормально, а вот с русским беда, нужно ту функцию с кодировкой использовать наверно

Спустя 3 часа, 25 минут, 29 секунд (27.02.2010 - 21:27) baston написал(а):
John_761, спасибо.
Решил по-своему (озарило использовать функцию по расчетам слов в метро). Однако, не знаю пока, как вывести сообщение, если количество символов в слове превышает имеющееся.
А может быть и как-нибудь оптимизировать для вывода результата для разных слов: однобуквенных, двухбуквенных и т.д. вплоть до десятибуквенных...
Вот мое решение:
$str = 'Проект, задуманный как «дом для отдыха в естественной
обстановке», представляет небольшой двухэтажный прямоугольник (5,85х7 м)
со скатной кровлей, позволяющий в полной мере насладиться окружающим
видом на горы. В общем-то простой и небольшой дом получился довольно
гармоничным, заметным и современным.';
$musor = array(",", ".", "'", "\"", "«", "»", "(", ")");
$str = str_replace($musor, "", $str);
$words = explode(" ", $str);

$wc = array();
$num;

function counterwords($w, $y)
{
foreach($w as $val)
{
for($i=0; $i<count($val); $i++)
{
if(mb_strlen($val) == $y)
{
$num++;
$wc[] = $val;
}
}
}
$mywords = implode(", ", $wc);
return "<b>" .$mywords. "</b><br>Количество слов: " .$num. "<br><br>";
}

echo "Однобуквенные слова: " .counterwords($words, 1);
echo "Двухбуквенные слова: " .counterwords($words, 2);
echo "Трехбуквенные слова: " .counterwords($words, 3);
echo "Четырехбуквенные слова: " .counterwords($words, 4);
echo "Пятибуквенные слова: " .counterwords($words, 5);
echo "Шестибуквенные слова: " .counterwords($words, 6);
echo "Семибуквенные слова: " .counterwords($words, 7);
echo "Восьмибуквенные слова: " .counterwords($words, 8);
echo "Девятибуквенные слова: " .counterwords($words, 9);
echo "Десятибуквенные слова: " .counterwords($words, 10);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.