Я надеюсь на некоторую помощь.
Я думал, что это будет довольно тривиально — если немного неэффективно, но я явно что-то упускаю.
Мне дали задание определить возможные совпадения последовательностей с помощью строки чисел.
Идея состоит в том, чтобы взять строку чисел и посмотреть, существуют ли какие-либо последовательности чисел из файла библиотеки.
Строка = 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] Думая об этом, должны быть и другие последовательности?Вот простой способ вернуть массив, содержащий все совпадающие элементы:
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))
Других решений пока нет …