[0] => Array
(
[0] => Шла саша по шоссе и сосала сушку
)
[40] => Array
(
[0] => Шла
[1] => саша
[2] => по
[3] => шоссе
[4] => и
[5] => сосала
[6] => сушку
)
$a5 = "Шла саша по шоссе и сосала сушку"; // переменная с текстом
function mergeResult($a, $b, $needJoin = true) {
// fixme: увы не хватает времени на допилку...
if (!$needJoin) return array_merge($a, $b);
return array_map(function ($r) use ($a) {
return mergeResult($a, $r, false);
}, $b);
}
function buildLevel(array $words, $level) {
// с первым уровнем все просто
if ($level === 1) return [implode(' ', $words)];
// со вторым чуть по сложнее...
$result = [];
$chunk = [];
while(count($words) >= $level) {
// отделяем первое слово из "строки" и зановим его к первому "слагаемому"
array_push($chunk, array_shift($words));
$result[] = mergeResult(buildLevel($chunk, 1), buildLevel($words, $level-1), $level > 2);
}
return $result;
}
$words = preg_split("-[\W]-u", $a5, -1, PREG_SPLIT_NO_EMPTY);
// я торопился по сему вот так...
$r = [];
for($i=1;$i<count($words);$i++) {
$r = array_merge($r, buildLevel($words, $i));
}
print_r($r);
[20] => Array
(
[0] => Array
(
[0] => Шла саша
[1] => Array
(
[0] => по
[1] => Array
(
[0] => шоссе
[1] => Array
(
[0] => и
[1] => сосала
[2] => сушку
)
)
)
)
)
)
[0] => Array
(
[0] => Шла саша по шоссе и сосала сушку
)
[40] => Array
(
[0] => Шла
[1] => саша
[2] => по
[3] => шоссе
[4] => и
[5] => сосала
[6] => сушку
)
$words = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY);
print_r(buildLevel($words, 1));
на что то другое, я наверно не смогу.print_r($c);
должна быть один, что означает что все массивы в одной переменной [40] => Array
(
[0] => Шла
[1] => саша
[2] => по
[3] => шоссе
[4] => и
[5] => сосала
[6] => сушку
)
)
$b = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY); // супер-пупер разделитель текста
$a = "Шла саша по шоссе и сосала сушку"; // переменная с текстом
function mergeResult($a, $b, $needJoin = true) {
// fixme: увы не хватает времени на допилку...
if (!$needJoin) return array_merge($a, $b);
return array_map(function ($r) use ($a) {
return mergeResult($a, $r, false);
}, $b);
}
function buildLevel(array $words, $level) {
// с первым уровнем все просто
if ($level === 1) return [implode(' ', $words)];
// со вторым чуть по сложнее...
$result = [];
$chunk = [];
while(count($words) >= $level) {
// отделяем первое слово из "строки" и зановим его к первому "слагаемому"
array_push($chunk, array_shift($words));
$result[] = mergeResult(buildLevel($chunk, 1), buildLevel($words, $level-1), $level > 2);
}
return $result;
}
$words = explode(' ',$a);
// я торопился по сему вот так...
print_r(buildLevel($words, 1));
print_r(buildLevel($words, 2));
print_r(buildLevel($words, 3));
print_r(buildLevel($words, 4));
print_r(buildLevel($words, 5));
print_r(buildLevel($words, 6));
print_r(buildLevel($words, 7));
print_r(buildLevel($words, 9));
если вы еще с php5.3 работаете - немедленно обновитесь.Я на Денвере проверяю, наверно надо обновить.
И что вы имеете в виду под "нестандартно".То что я не вижу переменную с текстом и разделитель текста не используется
$b = preg_split('-([\W])-u', $a, -1, PREG_SPLIT_NO_EMPTY);
я так понимаю у вас в коде разделяется текст через пробел, если даже он будет работать, как он будет разделять символы типа !"№;%;? или он их просто отсеет.
проблема возникает когда появляются 4 слова в переменной
например напишем 1 2 3 4
У нас выводит
возьмем например просто 1 2 3
Получаем
Идеально работает
Нужно вставить какую то дополнительную проверку при комбинации в 4 слова, или разбить текст с двух сторон, если такое возможно.
Пытался найти подобие
array_unshift — Добавляет один или несколько элементов в начало массива
array_push — Добавляет один или несколько элеметов в конец массива
array_shift — Извлекает первый элемент массива
array_pop — Извлекает последний элемент массива
только так — Добавляет один или несколько элеметов в начало и в конец массива
только так 2 — Извлекает последний и первый элемент массива
Пытался сделать сразу двойную разбивку, пока не получается интегрировать array_unshift и array_push