Поиск части слова
Здравствуйте!
Помогите, пожалуйста, с такой задачей: Для поиска повторяющегося набора цифр (кода), использую такой код: $file=file("test.txt"); $str=$file[0]; $array=explode(",",$str); $value=1; if(($key = array_search($value,$array)) !== FALSE){ unset($array[$key]); } $first_array = array_count_values($array); $second_array = array_diff($first_array, [$value]); var_dump($second_array); который выводит, число вхождений (повторений) кода. Задача в том, что $file=file("test.txt"); ищет строгое соответствие, а надо, скажем, при совпадении, например, первых 5 цифр (как по маске), чтобы считался повтор. Как это можно реализовать? |
Цитата:
Что нужно сделать не понял. |
Цитата:
$array = explode(",", $file[0]); Цитата:
|
По как по "маске" - имела ввиду соответствие, но не строгое, поэтому "как". Да можно без "$str", сделать сразу, осталось, т.к. код несколько раз трансформировался. Безусловно, функция «file» ничего не ищет. А сделать нужно, чтобы код выполнял ту же работу, что и сейчас, с той лишь разницей, что сейчас поиск вхождений ищет идентичность строк кода 1234567, а надо, чтобы принимался код, например, и 1234576, или 1234598 и т.д.
|
Т.е., например, 5 цифр кода при повторе кода, принимались в строгом соответствии, а последующие не имели принципиального значения.
|
Sonya, нужно что-то типа этого?
<?php $haystack=array('123456','123789','124987','321654'); $needle='123'; $result=array(); $charset='UTF-8'; $needle_length=mb_strlen($needle,$charset); foreach($haystack as $string){ if(mb_substr($string,0,$needle_length,$charset)==$needle) $result[]=$string; } var_dump($result); exit; |
Дело в том, что я не знаю цифры кодов в массиве, они будут выводиться, только в случае повтора.
|
Nexus,
цифры, латиница, управляющие символы в монгобайтной кодировке все равно занимают один байт, $charset='UTF-8' и mb_strlen для них совсем не требуется. |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
http://fi2.php.net/manual/ru/function.array-filter.php http://fi2.php.net/manual/ru/function.strstr.php |
Возможно я не понял - фиксированная, это знаем что к примеру 4 символа, но не знаем какие именно?
|
Цитата:
|
Цитата:
|
Цитата:
|
Функция «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, или я очень устал, или вы действительно изъясняетесь так, что вас невозможно понять...
У вас есть: 1. файл, который содержит список чисел, разделенных запятыми; 2. длинна искомой строки. Нужно: Определить сколько слов имеет одинаковое начало и вернуть список этих слов. Верно? Код, что я привел зависает, если ему передать на обработку массив длинною в пол миллиона элементов? |
Цитата:
|
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; |
Sonya,
и array_filter тоже в таком случае не годится. Нет сейчас времени, а словами это так: обычный цикл for, опрашивать сразу по два крайних элемента массива, двигаясь к центру массива числа равные длине маски, это ключи, если такого нет, создаем и под ним помещаем элементы, у которых число начинается с этого ключа в полученном массиве взять те, у которых вложения не пустые (или удалить такие) |
<?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; |
Цитата:
|
Только не слов, а цифровых кодов.
|
$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)); |
Спасибо!
|
Цитата:
$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)); |
Часовой пояс GMT +3, время: 00:36. |