Похоже, что strpos
и substr
могут быть наиболее последовательными.
Альтернатива, однако, поскольку у вас уже есть список слов, вместо удаления каждого слова вы можете использовать вместо него конкатенацию,Сокращение количества вызовов функций за итерацию.
$str = 'The quick brown fox jumps over the lazy dog';
$base = array_reverse(explode(' ', $str));
$words = [$placeholder = array_shift($base)];
foreach($base as $word) {
$words[] = $placeholder = $word . ' ' . $placeholder;
}
$words = array_reverse($words);
print_r($words);
Результаты
числа очень противоречивы в 3v4l - тест для васверсия сервера и PHP
PHP 5.6.38
implode 100 times in: 0.00047302/sec
strpos 100 times in: 0.00035501/sec
concat 100 times in: 0.00034595/sec
Возвращает
Array
(
[0] => The quick brown fox jumps over the lazy dog
[1] => quick brown fox jumps over the lazy dog
[2] => brown fox jumps over the lazy dog
[3] => fox jumps over the lazy dog
[4] => jumps over the lazy dog
[5] => over the lazy dog
[6] => the lazy dog
[7] => lazy dog
[8] => dog
)
Примечание Существует также много способов реализации конкатенации.
Вы можете заменить array_shift
, который требует переиндексации массива, на array_pop
, что немного снижает сложность кода операции.
$base = explode(' ', $str);
$words = [$placeholder = array_pop($base)];
$base = array_reverse($base);
Вы также можете использовать условие для клавиши в пределах foreach
, чтобы определить, следует ли использовать конкатенацию, с небольшой потерей производительности.
$base = array_reverse(explode(' ', $str));
$s = '';
foreach ($base as $i => $w) {
$words[] = $s = ($i === 0 ? $w : $w . ' ' . $s);
}
Обновлено
В качестве еще одной альтернативы для уменьшения количества вызовов кода операции вы можете использовать for count()
, используя $i--
для обработки массива в обратном порядке.С возможностью замены $l = count($base) - 1;
на end($base); $l = key($base);
или использованием array_key_last
для PHP 7.3
$base = explode(' ', $str);
$l = count($base)-1;
$words = [$placeholder = $base[$l--]];
for ($i=$l; $i>=0;$i--) {
$words[] = $placeholder = $base[$i] . ' ' . $placeholder;
}
$words = array_reverse($words);
print_r($words);
PHP 5.6.38
strpos 100 times in: 0.00043607/sec
concat 100 times in: 0.00044894/sec
end/key 100 times in: 0.00037289/sec
count-- 100 times in: 0.00036097/sec