 
			
				06.09.2017, 21:40
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.01.2015 
					
					
					
						Сообщений: 12,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Nexus, 
 нет ничего подпадающее под разбор UTF, что вы уперлись в mb_? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.09.2017, 21:44
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от 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,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Sonya, 
 и array_filter тоже в таком случае не годится. Нет сейчас времени, а словами это так: 
 
обычный цикл for, опрашивать сразу по два крайних элемента массива, двигаясь к центру массива 
 
числа равные длине маски, это ключи, если такого нет, создаем и под ним помещаем элементы, у которых число начинается с этого ключа 
 
в полученном массиве взять те, у которых вложения не пустые (или удалить такие) 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.09.2017, 22:32
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
<?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,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
$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,989
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 
 
 
 
	 | 
 
 
 |