У меня есть предложение в простой строке PHP:
$myString = "This is a test.";
Мне нужен массив, который содержит все возможные связи между двумя словами или двумя группами слов следующим образом (пробел в качестве разделителя):
$myArray = [
["This", "is"],
["This", "is a"],
["This", "is a test."],
["This is", "a"],
["This is", "a test."],
["This is a", "test."],
["is", "a"],
["is", "a test."],
["is a", "test."],
["a", "test."]
];
Он должен работать как можно быстрее, надеюсь, за одно сканирование входной строки.
РЕДАКТИРОВАТЬ:
Вот что я получил, используя рекурсивную функцию:
/**
* @param string $string
* @return string[]
*/
private function split($string)
{
$whitespace = strpos($string, ' ');
if (false === $whitespace) {
return;
}
$segment = substr($string, 0, $whitespace);
$string = substr($string, $whitespace + 1);
$this->link($segment, $string);
$this->split($string);
}
/**
* @param string $segment
* @param string $string
*/
private function link($segment, $string)
{
$this->links[] = [$segment, $string];
}
Тогда я звоню $this->split('this is a test');
и получить:
var_dump($this->links);
Array
(
[0] => Array
(
[0] => This
[1] => is a test.
)
[1] => Array
(
[0] => is
[1] => a test.
)
[2] => Array
(
[0] => a
[1] => test.
)
)
Я собирался обходить массив $ links в обратном направлении при каждом вызове метода link (), но вычислительные затраты для большого документа были бы непомерно высокими.
Задача ещё не решена.
Других решений пока нет …