Поиск повторяющихся последовательных символов в строках и замена каждой строки на 1 или 0

У меня есть массив

$array = array("ab","aab","abb","abab","abaab","abbb");

Я хочу найти элементы, которые содержат повторяющиеся последовательные символы, такие как aab, abb, abbb и заменить их 1,

И наоборот, если элемент не содержит повторяющихся последовательных символов (например, ab а также abab) тогда его следует заменить на 0,

0

Решение

Этот подход использует array_map и preg_match для возврата массива совпадений true / false, основанных на повторяющейся строке. Ключи будут соответствовать вашему входному массиву.

(.) находит любого персонажа и помещает его в первую группу захвата, затем \1 гарантирует, что за ним следует точное совпадение символов.

$array = array("ab","aab","abb","abab","abaab","abbb");
function StringHasRepetition( $string )
{
return preg_match('/(.)\1/', $string);
}
$matches = array_map('StringHasRepetition',$array);
print_r( $matches );
// Array ( [0] => 0 [1] => 1 [2] => 1 [3] => 0 [4] => 1 [5] => 1 )

В качестве лямбда-функции:

$array = array("ab","aab","abb","abab","abaab","abbb");
$matches = array_map( function( $string ){
return preg_match('/(.)\1/', $string);
} ,$array);
print_r( $matches );
// Array ( [0] => 0 [1] => 1 [2] => 1 [3] => 0 [4] => 1 [5] => 1 )
1

Другие решения

preg_replace() может манипулировать всем вашим массивом всего двумя шаблонами регулярных выражений за один вызов. Сначала преобразуйте строки без последовательных повторяющихся символов в 0, Затем преобразуйте все не 0 значения для 1,

Код: (См. Демо-ссылку для более подробной разбивки метода)

$array=["ab","aab","abb","abab","abaab","abbb",'1','11','10','0','00100','1101','01'];
var_export(preg_replace(['/^(?:(.)(?!\1))*$/','/^(?!0$).*/'],[0,1],$array));

Выход:

array (
0 => '0',
1 => '1',
2 => '1',
3 => '0',
4 => '1',
5 => '1',
6 => '0',
7 => '1',
8 => '0',
9 => '0',
10 => '1',
11 => '1',
12 => '0',
)
1

По вопросам рекламы [email protected]