06.09.2017, 21:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Nexus,
нет ничего подпадающее под разбор UTF, что вы уперлись в mb_?
|
|
06.09.2017, 21:44
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от laimas
|
Nexus,
нет ничего подпадающее под разбор UTF, что вы уперлись в mb_?
|
Действительно (сарказм).
<?php
function func(array $words,$length){
$results=array();
foreach($words as $string){
if(strlen($string)<$length)
continue;
$str=substr($string,0,$length);
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',',',strtolower($string));
$string=array_filter(explode(',',$string));
var_dump(func($string,5));
exit;
|
|
06.09.2017, 21:51
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Sonya,
и array_filter тоже в таком случае не годится. Нет сейчас времени, а словами это так:
обычный цикл for, опрашивать сразу по два крайних элемента массива, двигаясь к центру массива
числа равные длине маски, это ключи, если такого нет, создаем и под ним помещаем элементы, у которых число начинается с этого ключа
в полученном массиве взять те, у которых вложения не пустые (или удалить такие)
|
|
06.09.2017, 22:32
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
<?php
header('Content-Type: text/html; charset=utf-8');
ini_set('memory_limit','512M');
function func(array $words,$length){
if(count($words)%2==1)
$words[]='';
$words=array_values($words);
$results=array();
for($i=0,$j=count($words)-1;$i<$j;$i++,$j--){
foreach(array($i,$j) as $key)
if(strlen($words[$key])>=$length){
$str=substr($words[$key],0,$length);
$results[$str][]=$words[$key];
};
};
return array_map(function($vals){
return array_unique($vals);
},array_filter($results,function($vals){
return count($vals)>1;
}));
};
$array=array();
$i=1000000;
while($i--)
$array[]=mt_rand(0,mt_getrandmax());
$start=microtime(true);
$res=func($array,3);
echo 'Найдено ',count($res),' результатов за ',number_format(microtime(true)-$start,3,'.',' '),' сек.';
exit;
Последний раз редактировалось Nexus, 06.09.2017 в 22:38.
|
|
06.09.2017, 22:33
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Сообщение от Nexus
|
Sonya, или я очень устал, или вы действительно изъясняетесь так, что вас невозможно понять...
У вас есть:
1. файл, который содержит список чисел, разделенных запятыми;
2. длинна искомой строки.
Нужно:
Определить сколько слов имеет одинаковое начало и вернуть список этих слов.
Верно?
Код, что я привел зависает, если ему передать на обработку массив длинною в пол миллиона элементов?
|
Да.
|
|
06.09.2017, 23:04
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Только не слов, а цифровых кодов.
|
|
11.09.2017, 04:23
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
$a = [
1234576,
2456901,
1234598,
2456776,
2456993,
1234567,
1234555,
3245089
];
$len = 4;
for($i = 0, $j = count($a)-1, $k = ceil(count($a)/2); $i < $k; $i++, $j--) {
$group[substr($a[$i], 0, $len)][] = $a[$i];
$group[substr($a[$j], 0, $len)][] = $a[$j];
}
print_r($group);
print_r(array_values($group));
|
|
16.09.2017, 10:13
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Спасибо!
|
|
16.09.2017, 12:48
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Sonya
|
Спасибо!
|
Не за что. Я не знаю что за такой пакет этих цифр, но учтите, что если их количество в массиве будет не четным, то в результирующем массиве будет дубликат одного значения. Если нечетное число также ожидается, тогда нужно так:
$a = [
1234579,
2456901,
1234598,
2456776,
2456993,
1234567,
1234555,
3245089,
1234778
];
$len = 4;
if(count($a) & 1) array_push($a, null); //дополнить массив до четного
for($i = 0, $j = count($a)-1, $k = count($a)/2; $i < $k; $i++, $j--) {
$group[substr($a[$i], 0, $len)][] = $a[$i];
if($a[$j]) $group[substr($a[$j], 0, $len)][] = $a[$j];
}
print_r($group);
print_r(array_values($group));
Последний раз редактировалось laimas, 16.09.2017 в 14:17.
|
|
|
|