06.09.2017, 17:48
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Поиск части слова
Здравствуйте!
Помогите, пожалуйста, с такой задачей:
Для поиска повторяющегося набора цифр (кода), использую такой код:
$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 цифр (как по маске), чтобы считался повтор. Как это можно реализовать?
|
|
06.09.2017, 18:15
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от Sonya
|
$file=file("test.txt"); ищет строгое соответствие,
|
Функция «file» ничего не ищет, а читает файл, разбивает его по строчкам и возвращает массив этих строк.
Что нужно сделать не понял.
|
|
06.09.2017, 18:23
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Sonya
|
$str=$file[0];
$array=explode(",",$str);
|
Здесь $str живет короче мгновения и далее используется один раз, зачем же вы ее определяете, а не сразу?
$array = explode(",", $file[0]);
Сообщение от Sonya
|
первых 5 цифр (как по маске)
|
Какой маске?
|
|
06.09.2017, 18:45
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
По как по "маске" - имела ввиду соответствие, но не строгое, поэтому "как". Да можно без "$str", сделать сразу, осталось, т.к. код несколько раз трансформировался. Безусловно, функция «file» ничего не ищет. А сделать нужно, чтобы код выполнял ту же работу, что и сейчас, с той лишь разницей, что сейчас поиск вхождений ищет идентичность строк кода 1234567, а надо, чтобы принимался код, например, и 1234576, или 1234598 и т.д.
|
|
06.09.2017, 18:49
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Т.е., например, 5 цифр кода при повторе кода, принимались в строгом соответствии, а последующие не имели принципиального значения.
|
|
06.09.2017, 19:37
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
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;
|
|
06.09.2017, 19:44
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Дело в том, что я не знаю цифры кодов в массиве, они будут выводиться, только в случае повтора.
Последний раз редактировалось Sonya, 06.09.2017 в 19:48.
Причина: Добавлено
|
|
06.09.2017, 20:00
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Nexus,
цифры, латиница, управляющие символы в монгобайтной кодировке все равно занимают один байт, $charset='UTF-8' и mb_strlen для них совсем не требуется.
Последний раз редактировалось laimas, 06.09.2017 в 20:05.
|
|
06.09.2017, 20:05
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Sonya
|
надо, чтобы принимался код, например, и 1234576, или 1234598
|
Сообщение от Sonya
|
Дело в том, что я не знаю цифры кодов в массиве
|
Значит ищите по совпадениям - совпали первые N у набора М, это один набор, совпали К у набора I, это другой набор. Так что-ли или "маска" фиксированная по длине?
|
|
06.09.2017, 20:17
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Сообщение от laimas
|
Значит ищите по совпадениям - совпали первые N у набора М, это один набор
|
- в этом и проблема - реализовать применимо к коду. С чего начать?
Сообщение от laimas
|
Так что-ли или "маска" фиксированная по длине?
|
- да, будет по длине фиксированной.
|
|
|
|