Найти последовательность совпадений в строке без пробелов (используя php)

Я надеюсь на некоторую помощь.
Я думал, что это будет довольно тривиально — если немного неэффективно, но я явно что-то упускаю.

Мне дали задание определить возможные совпадения последовательностей с помощью строки чисел.
Идея состоит в том, чтобы взять строку чисел и посмотреть, существуют ли какие-либо последовательности чисел из файла библиотеки.
Строка = 123456789
Библиотека = 12, 34, 56, 78, 9, 123, 456, 789, 1234, 56789

Я должен сгенерировать многомерный массив совпадений,
(0) (0–12) (1–34) (2–56) (3–78) (4–9)
(1) (0 123) (1 456) (2 789)
(2) (0 — 1234) (1 — 56789)

Вот мой код

$library = array('12', '34', '56', '78', '9', '123', '456', '789', '1234', '56789' );
$string = "123456789";
$string = trim(strtolower($string));

echo $string."<hr/>";

function possibles ($library, $string, $c, $array){
$string2 = $string;
$c = 0;

foreach ($library as $sequence){

if(strpos($string2, $sequence) === 0){
$array[$c] = $sequence;
$string2 = substr($string2, strlen($sequence));
echo "-".$sequence."-".$string2."-".$c;
possibles($library, $string2,  $c, $array);
} else {$string2 = $string;
echo "*<br/>";
continue;
}
$c++;
$string2=$string;
}
return $array;
}

$array = array();
print_r(possibles($library,$string, $c, $array));

(Да, я пытался отформатировать его)

Вышеуказанное настроено на вывод с отголосками найденного контента.
1) Это содержание не то, что я ожидал
2) Это содержимое не соответствует печатному выводу из Print_r

Пожалуйста, помогите, так как я не вижу, что я сделал неправильно 🙁

[APPEND

Вот переработанная версия

$library = array('12', '34', '56', '78', '9', '123', '456', '789', '1234', '56789' );
$string = "123456789";
$string = trim(strtolower($string));

function possibles ($library, $string, $c, $array, $t){
$string2 = $string;
$strlen = strlen($string2);
$c = 0;

foreach ($library as $sequence){
$sequence = trim($sequence);
$sequencelen = strlen($sequence);
if(strpos($string2, $sequence) !== 0  ||  $strlen < $sequencelen){
break;
}else {
echo $sequence." ";
$array[$c][] = $sequence;
$string2 = substr($string2, strlen($sequence));
possibles ($library, $string2, $c, $array, $t);
}

}$c++;
return $array;
}
$t = array();
$array = array();
print_r(possibles($library,$string, $c, $array, $t));

Какие выходы;
Array ([0] => Array ([0] => 12 [1] => 34 [2] => 56 [3] => 78 [4] => 9))
Это почти правильно. Последовательность есть, но только первая.
Я ожидаю также увидеть;
Массив ([1] => Массив ([0] => 123 [1] => 456 [2] => 789))
Массив ([2] => Массив ([0] => 1234 [1] => 56789))

Там, надеюсь, это немного прояснит?

[APPEND] Думая об этом, должны быть и другие последовательности?
12 34 5678 // 1234 56 78 9 // 123 456 78 9 и т. Д.?

0

Решение

Вот простой способ вернуть массив, содержащий все совпадающие элементы:

function getMatches($search, $string) {
$matches = array();
// if it's an array, go through each element and add any matches
if (is_array($search)) {
// let's not consider nested arrays for now
foreach($search AS $s) {
if (strpos($string, $s) !== FALSE) {
$matches[] = $s;
}
}
}
// otherwise we just search right away
elseif (strpos($string, $search) !== FALSE) {
$matches[] = $search;
}
// all matching entries are now in this one-dimensional array
return $matches;
}

Основываясь на поиске в $ library, это вернет массив ([0] => 12 [1] => 34 [2] => 56, [3] => 78, [4] => 9, [5] = > 123, [6] => 456, [7] => 789, [8] => 1234, [9] => 56789))

0

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

Других решений пока нет …

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