LocKing
@LocKing
Не задавай вопросов — не услышишь лжи

Как разбить строку на массив с повторением?

Извиняюсь за непонятную формулировку сути вопроса.
Проще объяснить на примере:

Имеется строка, в которой слова идут через определенный разделитель.
Например "test.tests.testst.tesrtcefdg.teestcvxv"

Каким образом можно получить из данной строки нижеуказанный массив?

Array
(
[0] => test
[1] => test.tests
[2] => test.tests.testst
[3] => test.tests.testst.tesrtcefdg
[4] => test.tests.testst.tesrtcefdg.teestcvxv
)

Т.е. функцией explode это сделать не получится.
Возможно через поиск по регулярному выражению с помощью preg_mathc_all? Но никак не получается составить корректную регулярку.
  • Вопрос задан
  • 2314 просмотров
Решения вопроса 1
Очевидно же, что нужно делать конкатенацию каждого текущего элемента с предыдущим.
$str = 'test.tests.testst.tesrtcefdg.teestcvxv';
$arr = explode('.', $str);
for ($i=1; $i<count($arr); $i++) {
    $arr[$i] = $arr[$i-1].'.'.$arr[$i];
}


Можно рекурсивно запилить, если разнообразия в жизни не хватает. Но в PHP это недостаточно компактно выходит:
$str = 'test.tests.testst.tesrtcefdg.teestcvxv';

function toArray($str, $arr=[]) {
    $pos = strripos($str, '.');
    if ($pos === False) {
        array_unshift($arr, $str);
        return $arr;
    } 
    array_unshift($arr, $str);
    return toArray(substr($str, 0, $pos), $arr);
}

print_r(toArray($str));
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
Цикл в котором от базовой строки отрезается по куску и добавляется в массив.
Ответ написан
Комментировать
@Billy_Milligan
Первое что пришло в голову.
Внимание! не тестировал.

function myExplode($str, $divider) {
    $strs = explode($divider, $str);

    for($i=1 ; $i<count($strs) ;  $i++) {
        $strs[$i] = $strs[$i-1].$divider.$strs[$i];
    }

    return $arr;
}

$s = "test.tests.testst.tesrtcefdg.teestcvxv";
$a = myExplode($s, ".");
Ответ написан
Комментировать
@melnikov_m
$string = "test.tests.testst.tesrtcefdg.teestcvxv";
$delitel = '.';
$mass = explode ($delitel, $string);
for ($i=0; $i<count($mass); $i++) {
   $result[]  = $mass[$i];
   if ($i>0) {
       $result[] = $mass[$i-1].$delitel.$mass[$i];
   }
}
print_r($result);

Сходу вот так, но думаю можно улучшить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
23 апр. 2024, в 08:58
15000 руб./за проект
23 апр. 2024, в 08:42
60 руб./за проект