Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
mr.pomidor
1

Наиболее часто встречаемые строки

03.12.2011, 19:15. Показов 3761. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: Задан массив текстовых строк. Вывести список трех строк, которые чаще всего встречаются во входном массиве.
Thank you for your efforts =)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2011, 19:15
Ответы с готовыми решениями:

Как определить наиболее часто повторяемый элемент массива?
Помогите пожалуйста исправить ошибку. Код почему-то неправильно работает. Либо предложите свои...

Капча. Доработать, чтобы вводить только наиболее часто встречающиеся символы
Здравствуйте. Сделал капчу. Нехитрую. Длина- 12 символов от '0' до '9' <?php // Задаем список...

Как вывести наиболее часто встречаемые элементы в массиве?
Задание. Вывод наиболее часто встречаемых элементов в массиве Написать функцию, которая в массиве...

Подсчет наиболее часто повторяющейся строки
Здравствуйте, уважаемые форумчане. Нужна небольшая помощь по Access'у. Имеется таблица:...

11
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
03.12.2011, 19:47 2
Свои варианты?
0
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.12.2011, 00:44 3
Вот решение.
Допустим у нас есть массив строк $string (массив НЕ ассоциативный)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$string = (
     // строки
);
 
// Получаем кол-во значений иходного массива (для каждого совпадения свое кол-во)
$cn = array_count_values($string);
 
// Получаем значения получившегося массива
$ar_val = array_values($cn);
// Сортируем в обратном порядке
rsort($ar_val);
 
// $ar_val - массив с кол-вами эл-тов в нужном нам порядке. Проходим по нему
for ($j = 0; $j < count($ar_val); $j++)
{
    // Будем брать из $cn те элементы, у которых значения совпадают с ключами массива $ar_val
    // т.к., $ar_val идет от большого к меньшему, мы можем оттуда взять первые 3 большие значения
    foreach ($cn as $key => $val)
    {
        // есди не совпадают, продолжаем ничего не делая
        if ($val != $ar_val[$j]) continue;
        // а так выводим в браузер
        echo $key . ' => ' . $ar_val[$j] . '<br />';
    }
    // На третьем элементе умираем
    if ($j == 2) break;
}
0
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
04.12.2011, 10:18 4
Много букаф)) Вот так попроще же:
PHP
1
2
3
4
5
6
7
8
    $string = array('hhh', 'hhh', 'ggg', 'ddd', 'aaa', 'aaa', 'aaa');
 
    $cn = array_count_values($string);
    ksort($cn);
    $arr = array_slice($cn, 0, 3);
    $arr = array_flip($arr);
    
    print_r($arr);
0
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.12.2011, 12:51 5
nubo, на счет
Цитата Сообщение от nubo Посмотреть сообщение
array_slice
согласен, будет короче.
а
Цитата Сообщение от nubo Посмотреть сообщение
array_flip
т.к., меняет местами ключи со значениями, так она автоматом удалит совпадающие ключи, напр., если будут более 2-х совпадения с одинаковыми строками, то твой пример выберит один из них, что протеворечит условию.
и код не совсем правильно работает )
0
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
04.12.2011, 16:42 6
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
nubo, на счет согласен, будет короче.
а т.к., меняет местами ключи со значениями, так она автоматом удалит совпадающие ключи, напр., если будут более 2-х совпадения с одинаковыми строками, то твой пример выберит один из них, что протеворечит условию.
и код не совсем правильно работает )
Семен Семеныч!))) Конечно. Вот так надо:

PHP
1
2
3
4
5
6
7
8
    $string = array('hhh', 'hhh', 'hhh', 'ggg', 'ddd', 'aaa', 'aaa', 'aaa');
 
    $cn = array_count_values($string);
    arsort($cn);
    $arr = array_slice($cn, 0, 3);
    $arr = array_keys($arr);
        
    print_r($arr);
Добавлено через 3 часа 10 минут
UPD Почему то Вш код выдает такой результат:

hhh => 3
aaa => 3
hhh => 3
aaa => 3
ggg => 1
ddd => 1
странно. Я не разбирался, хотел скорость измерить.
1
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.12.2011, 23:44 7
Цитата Сообщение от nubo Посмотреть сообщение
Почему то Вш код выдает такой результат:
нея, чет не так скопировал. Единственный бэд то, что скрипт выводит не 3 строки с макс кол-вом, а + еще и те, кол-во строк которых совпадает с третьим (т.е., если третьим элементов будет строка с кол-вом совпадений 1, и таких строк будет не одна, то скрипт выведит их все).
Зато так точно работает (надо было просто rsort сменить на arsort)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Массив строк
$string = array( 'hhh', 'aaa', 'hhh', 'ggg', 'ddd', 'aaa', 'aaa', 'ссс', 'ссс' );
 
// Получаем кол-во значений иходного массива (для каждого совпадения свое кол-во)
$cn = array_count_values($string);
// Сортируем в обратном порядке сохраняя ключи
arsort($cn);
 
// Получаем ключи и значения получившегося массива
$ar_val = array_values($cn);
$ar_key = array_keys($cn);
 
// Берем первые 3 ключа и значения
$key = array_slice($ar_key, 0, 3);
$val = array_slice($ar_val, 0, 3);
 
// Объединяем (создаем ассоциативный массив для удобства)
// Можно и по циклю пустить 2 массива (незнаю, что быстрее будет), но напишу так (через print_r)
$array = array_combine($key, $val);
 
echo '<pre>';
print_r($array);
echo '</pre>';
Выводит
Код
Array
(
    [aaa] => 3
    [hhh] => 2
    [ссс] => 2
)
0
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
04.12.2011, 23:49 8
Так а зачем ключами то их? Ему же список вроде надо. Мой последний это выдает:
PHP
1
2
3
4
5
6
Array
(
    [0] => hhh
    [1] => aaa
    [2] => ggg
)
0
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.12.2011, 23:52 9
да да, проверил и твой код, работает.
вот этот момент и хотел бы отметить - не показывает кол-во выводимых строк

Добавлено через 1 минуту
Цитата Сообщение от nubo Посмотреть сообщение
Так а зачем ключами то их?
так это можно поменять на этапе array_combine
0
113 / 70 / 2
Регистрация: 31.07.2010
Сообщений: 337
04.12.2011, 23:53 10
Ну твой вариант можно получить убрав из моего кода эту строку (будет еще короче )
PHP
1
   // $arr = array_keys($arr);
PHP
1
2
3
4
5
6
Array
(
    [hhh] => 3
    [aaa] => 3
    [ggg] => 1
)
Только как это использовать?
0
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
04.12.2011, 23:59 11
Цитата Сообщение от nubo Посмотреть сообщение
Ну твой вариант можно получить убрав из моего кода эту строку
ну да
по началу мысли так и шли, но чет не подумал о arsort();, а rsort(); превращал ключи массива $cn в числа, вот и нагородил лишние строки.
Цитата Сообщение от nubo Посмотреть сообщение
Только как это использовать?
незнаю, можно просто вывести в цикле, что по условию и требуется (а кол-во добавил, ну типа для доказательства, что это именно нужные нам строки). можно оставить и print_r
0
mr.pomidor
10.12.2011, 01:21 12
Спасибо большое, решение очень простое а я додуматся не мог
10.12.2011, 01:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.12.2011, 01:21
Помогаю со студенческими работами здесь

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

20 наиболее часто встречающихся слов
дан файл. выписать 20 наиболее часто встречающихся слов в алфавитном порядке. (структуры...

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

наиболее часто встречающиеся байти
нужна программа которая открывает файл и находит в нем 5 наиболее часто встречающихся байт т.е...

Наиболее часто встречаемое слово
Для текстового файла определить самое часто встречающееся слово Помогите пожалуйста написать...

Наиболее часто встречаемое слово
Для текстового файла определить самое часто встречающееся слово Помогите пожалуйста написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru