Поиск комбинаций, preg_match_all

 
+1
 
PHP


<?php
$pattern="xyz";
$number=3;

$str="xyz, zxy, yzx, zzz, yy, zxy, yyy, zzz, zyz";
preg_match_all('/['.$pattern.']{'.$number.'}/', $str, $out);
$out=array_unique($out['0']);


foreach($out as $k=> $v) {

if (count(array_unique(preg_split('//', $v, -1, PREG_SPLIT_NO_EMPTY))) < $number) {
unset($out[$k]);
        }
    }

print_r($out);

?>

задан 01:23, 11.01.2016
ava 
dcc0
244

Ответы (3)


<?php

$pattern="xyz";
$number=3;

$str="xyz, zxy, yzx, zzz, yy, zxy, yyy, zzz, zyz, yzx, yzx, yzx, zzy";
preg_match_all('/['.$pattern.']{'.$number.'}/', $str, $out);
$out=array_unique($out['0']);


function check_uniq(&$out, $key, $number)  {
if (count(array_unique(preg_split('//', $out, -1, PREG_SPLIT_NO_EMPTY))) < $number) {
$out='';
}
}

array_walk($out, "check_uniq", $number);
print_r(array_diff($out, array('')));

?>

отвечен 02:55, 11.01.2016
ava 
dcc0
244


А если во входном потоке будет какое `xyzxy` - это должны быть 3 разных трехбуквенных комбинации? 

отвечен 11:35, 11.01.2016
ava 
ksnk
467


Не знаю. Задача не практическая, поиск лучшего варианта:

Вообще символы  - это общий пример. На практике, наверно это должны быть слова.



$pattern="xyz";
$number=3;
$str="xyzxy"; 

function check_uniq(&$out, $key, $number)  {
if (count(array_unique(preg_split('//', $out, -1, PREG_SPLIT_NO_EMPTY))) < $number) {
$out='';
}
}

$i=0;
while($i != $number) {
preg_match_all('/['.$pattern.']{'.$number.'}/', $str, $out,  PREG_SPLIT_NO_EMPTY, $i);
$out=array_unique($out['0']);
++$i;

array_walk($out, "check_uniq", $number);
print_r(array_diff($out, array('')));
}

отвечен 01:18, 12.01.2016
ava 
dcc0
244


Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  dcc0
advanced
Отправить