06.09.2017, 20:42
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Возможно я не понял - фиксированная, это знаем что к примеру 4 символа, но не знаем какие именно?
|
|
06.09.2017, 20:43
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
Nexus,
цифры, латиница, управляющие символы в монгобайтной кодировке все равно занимают один байт, $charset='UTF-8' и mb_strlen для них совсем не требуется.
|
Ну так это в моем коде только циферки используются, что действительно в файле находится и что необходимо искать - я без понятия.
|
|
06.09.2017, 20:45
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Сообщение от laimas
|
Возможно я не понял - фиксированная, это знаем что к примеру 4 символа, но не знаем какие именно?
|
Да, именно так, сейчас буду разбираться по ссылкам.
|
|
06.09.2017, 20:58
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Сообщение от Nexus
|
Ну так это в моем коде только циферки используются, что действительно в файле находится и что необходимо искать - я без понятия.
|
Только цифры.
|
|
06.09.2017, 21:10
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Функция «func» ищет в списке слов те, которые начинаются на одни и те же символы; принимает массив слов и длину строки; возвращает искомое, как массив.
<?php
function func(array $words,$length){
$ch='UTF-8';
$results=array();
foreach($words as $string){
if(mb_strlen($string,$ch)<$length)
continue;
$str=mb_substr($string,0,$length,$ch);
if(!isset($results[$str]))
$results[$str]=array();
$results[$str][]=$string;
};
return (array_map(function($vals){
return array_unique($vals);
},array_filter($results,function($vals){
return count($vals)>1;
})));
};
$string='Lorem Ipsum - это текст-"рыба", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной "рыбой" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.';
$string=preg_replace('#\W+?#uim',',',mb_strtolower($string,'UTF-8'));
$string=array_filter(explode(',',$string));
var_dump(func($string,5));
exit;
|
|
06.09.2017, 21:11
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Сообщение от laimas
|
Ну если фиксирована длина, то проще - array_filter и в нем проверять на совпадения от начала на длину маски.
|
В фильтре вставить strstr с параметрами от первого до n-го символа?
|
|
06.09.2017, 21:21
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Сообщение от Nexus
|
Функция «func» ищет в списке слов те, которые начинаются на одни и те же символы; принимает массив слов и длину строки; возвращает искомое, как массив.
|
Пыталась использовать код по поиску по словам, но при определенной длине строки из цифровых кодов, он просто переставал работать. Кодов может быть очень много, именно поэтому решила использовать код, который выложила. Чтобы было понятно о размере, то до 500 000 кодов, данный проверяла почти на 700 000, работает очень быстро, память не грузит.
|
|
06.09.2017, 21:31
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Sonya, или я очень устал, или вы действительно изъясняетесь так, что вас невозможно понять...
У вас есть:
1. файл, который содержит список чисел, разделенных запятыми;
2. длинна искомой строки.
Нужно:
Определить сколько слов имеет одинаковое начало и вернуть список этих слов.
Верно?
Код, что я привел зависает, если ему передать на обработку массив длинною в пол миллиона элементов?
|
|
06.09.2017, 21:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Sonya
|
В фильтре вставить strstr с параметрами от первого до n-го символа?
|
Нет, если неизвестна сама маска, а только ее длина, то strstr не нужен, нужно брать отрезок равный длине символов.
|
|
|
|