Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Поиск части слова (https://javascript.ru/forum/server/70463-poisk-chasti-slova.html)

laimas 06.09.2017 20:34

Цитата:

Сообщение от Sonya
да, будет по длине фиксированной.

Ну если фиксирована длина, то проще - array_filter и в нем проверять на совпадения от начала на длину маски.

http://fi2.php.net/manual/ru/function.array-filter.php
http://fi2.php.net/manual/ru/function.strstr.php

laimas 06.09.2017 20:42

Возможно я не понял - фиксированная, это знаем что к примеру 4 символа, но не знаем какие именно?

Nexus 06.09.2017 20:43

Цитата:

Сообщение от laimas (Сообщение 463907)
Nexus,
цифры, латиница, управляющие символы в монгобайтной кодировке все равно занимают один байт, $charset='UTF-8' и mb_strlen для них совсем не требуется.

Ну так это в моем коде только циферки используются, что действительно в файле находится и что необходимо искать - я без понятия.

Sonya 06.09.2017 20:45

Цитата:

Сообщение от laimas (Сообщение 463912)
Возможно я не понял - фиксированная, это знаем что к примеру 4 символа, но не знаем какие именно?

Да, именно так, сейчас буду разбираться по ссылкам.

Sonya 06.09.2017 20:58

Цитата:

Сообщение от Nexus (Сообщение 463913)
Ну так это в моем коде только циферки используются, что действительно в файле находится и что необходимо искать - я без понятия.

Только цифры.

Nexus 06.09.2017 21:10

Функция «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;

Sonya 06.09.2017 21:11

Цитата:

Сообщение от laimas (Сообщение 463911)
Ну если фиксирована длина, то проще - array_filter и в нем проверять на совпадения от начала на длину маски.

В фильтре вставить strstr с параметрами от первого до n-го символа?

Sonya 06.09.2017 21:21

Цитата:

Сообщение от Nexus (Сообщение 463916)
Функция «func» ищет в списке слов те, которые начинаются на одни и те же символы; принимает массив слов и длину строки; возвращает искомое, как массив.

Пыталась использовать код по поиску по словам, но при определенной длине строки из цифровых кодов, он просто переставал работать. Кодов может быть очень много, именно поэтому решила использовать код, который выложила. Чтобы было понятно о размере, то до 500 000 кодов, данный проверяла почти на 700 000, работает очень быстро, память не грузит.

Nexus 06.09.2017 21:31

Sonya, или я очень устал, или вы действительно изъясняетесь так, что вас невозможно понять...

У вас есть:
1. файл, который содержит список чисел, разделенных запятыми;
2. длинна искомой строки.

Нужно:
Определить сколько слов имеет одинаковое начало и вернуть список этих слов.

Верно?

Код, что я привел зависает, если ему передать на обработку массив длинною в пол миллиона элементов?

laimas 06.09.2017 21:40

Цитата:

Сообщение от Sonya
В фильтре вставить strstr с параметрами от первого до n-го символа?

Нет, если неизвестна сама маска, а только ее длина, то strstr не нужен, нужно брать отрезок равный длине символов.


Часовой пояс GMT +3, время: 17:13.