Мне нужно найти только элементы массива, которые имеют определенный набор букв и любого символа до или после набора букв.
У меня есть такие массивы:
$sample = array("sten", "netff", "enet", "denet"); $value = array('e', 'n', 't');
Мне нужно найти значения из массива $sample
которого есть символы 'e,n,t'
и один или два символа до или после (с обеих сторон, а не с обеих сторон) слова соответствия. Если я ищу с рисунком e, n, t и 1 буквой до или после (с обеих сторон, а не с обеих сторон), результат будет
array("sten", "enet")
и если я ищу с рисунком e, n, t и 2 буквами до или после (обе стороны, а не обе стороны), результат будет
array("netff", "denet")
Я попробовал regex с preg_grep()
но он не работает:
1 буква до или после (обе стороны, а не обе стороны):
$result = preg_grep("/^(?:.{1}".$value."|".$value.".{1})$/", $sample);
2 письма до или после (обе стороны, а не обе стороны):
$result = preg_grep("/^(?:.{2}".$value."|".$value.".{2})$/", $sample);
Я собираюсь предположить, что вы уже предварительно отфильтровали все строки длиной 4 или 5 символов – если нет, вы можете раскомментировать мою первую функцию фильтра.
Входы:
$findgroup=['eaten','enter','tend','sten','neat','dents','enet','netty','teeth','denet','teen','spent']; $values=['e','n','t'];
как$findgroup=['eaten','enter','tend','sten','neat','dents','enet','netty','teeth','denet','teen','spent']; $values=['e','n','t'];
Метод:
//$findgroup=array_filter($findgroup,function($v){return strlen($v)==4 || strlen($v)==5;}); $findgroup=array_filter($findgroup,function($v)use($values){ return sizeof(array_intersect(array_unique(str_split(substr($v,0,3))),$values))==3 || sizeof(array_intersect(array_unique(str_split(substr($v,-3))),$values))==3; }); var_export($findgroup); // omitted: neat, dents, teeth, teen
Вывод:
array ( 0 => 'eaten', 1 => 'enter', 2 => 'tend', 3 => 'sten', 6 => 'enet', 7 => 'netty', 9 => 'denet', 11 => 'spent', )