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

Sonya 06.09.2017 17:48

Поиск части слова
 
Здравствуйте!
Помогите, пожалуйста, с такой задачей:
Для поиска повторяющегося набора цифр (кода), использую такой код:
$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 цифр (как по маске), чтобы считался повтор. Как это можно реализовать?

Nexus 06.09.2017 18:15

Цитата:

Сообщение от Sonya
$file=file("test.txt"); ищет строгое соответствие,

Функция «file» ничего не ищет, а читает файл, разбивает его по строчкам и возвращает массив этих строк.

Что нужно сделать не понял.

laimas 06.09.2017 18:23

Цитата:

Сообщение от Sonya
$str=$file[0];
$array=explode(",",$str);

Здесь $str живет короче мгновения и далее используется один раз, зачем же вы ее определяете, а не сразу?

$array = explode(",", $file[0]);


Цитата:

Сообщение от Sonya
первых 5 цифр (как по маске)

Какой маске?

Sonya 06.09.2017 18:45

По как по "маске" - имела ввиду соответствие, но не строгое, поэтому "как". Да можно без "$str", сделать сразу, осталось, т.к. код несколько раз трансформировался. Безусловно, функция «file» ничего не ищет. А сделать нужно, чтобы код выполнял ту же работу, что и сейчас, с той лишь разницей, что сейчас поиск вхождений ищет идентичность строк кода 1234567, а надо, чтобы принимался код, например, и 1234576, или 1234598 и т.д.

Sonya 06.09.2017 18:49

Т.е., например, 5 цифр кода при повторе кода, принимались в строгом соответствии, а последующие не имели принципиального значения.

Nexus 06.09.2017 19:37

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;

Sonya 06.09.2017 19:44

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

laimas 06.09.2017 20:00

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

laimas 06.09.2017 20:05

Цитата:

Сообщение от Sonya
надо, чтобы принимался код, например, и 1234576, или 1234598

Цитата:

Сообщение от Sonya
Дело в том, что я не знаю цифры кодов в массиве

Значит ищите по совпадениям - совпали первые N у набора М, это один набор, совпали К у набора I, это другой набор. Так что-ли или "маска" фиксированная по длине?

Sonya 06.09.2017 20:17

Цитата:

Сообщение от laimas (Сообщение 463909)
Значит ищите по совпадениям - совпали первые N у набора М, это один набор

- в этом и проблема - реализовать применимо к коду. С чего начать?
Цитата:

Сообщение от laimas (Сообщение 463909)
Так что-ли или "маска" фиксированная по длине?

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


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