我知道如何在空格上分割输入字符串,但我需要生成一个值数组,其中每个元素包含前一个字符串加上下一个可用单词。
$str = "a nice and sunny day today";
$split = explode(' ', $str);
我怎么可能留下一个如下所示的数组:
$new[0] = 'a';
$new[1] = 'a nice';
$new[2] = 'a nice and';
$new[3] = 'a nice and sunny';
而不是手动执行此操作
$new[] = $split[0];
$new[] = $split[0] . $split[1];
$new[] = $split[0] . $split[1] . $split[2];
$new[] = $split[0] . $split[1] . $split[2] . $split[3];
您可能可以看到正在发生的模式。
因为这种情况最多可能发生在 15 个单词左右,所以我正在寻找一种更短且动态的方法来使用 foreach/某种函数来完成此操作。
$tmp = array();
$new = array();
for($i = 0; $i < count($split); $i++)
{
$tmp[] = $split[$i];
$new[] = implode(' ',$tmp);
}
更短的代码,相反的顺序:
$new = array();
for($i = count($split); $i >= 0; $i--)
{
$new[] = implode(' ',$split);
array_pop($split);
}
你可以这样做:
$str = "a nice and sunny day today";
$split = explode(' ', $str);
$newList = array();
// Non-empty string?
if($str) {
// Add the first element
$newList[] = $split[0];
for($i = 1; $i < count($split); $i++) {
// New element gets appended with previous
$newList[] = $newList[$i-1] . " " . $split[$i];
}
}
这比每次执行
implode
更有效,因为我们只是连接当前和前一个字符串。
还有一点效率低下 - 我们每次都调用
count
。我们不要这样做。
$newList[] = $split[0]
for($i = 1, $len = count($split); $i < $len; $i++) {
// New element gets appended with previous
$newList[] = $newList[$i-1] . " " . $split[$i];
}
<?php
$str = "1 2 3";
$split = explode(' ', $str);
/*
now $split is array('1','2','3')
Need to convert it to: array('1','1 2','1 2 3')
*/
$n = count($split);
$output = array();
for ($i = 0; $i < $n; ++$i)
{
$output[$i] = "";
for ($j = 0; $j <= $i; ++$j)
{
$output[$i] .= $split[$j];
if ($j != $i)
{
$output[$i] .= " ";
}
}
}
var_dump($output);
输出:
array(3) {
[0]=>
string(1) "1"
[1]=>
string(3) "1 2"
[2]=>
string(5) "1 2 3"
}
只需在循环中构建字符串并添加到数组中即可。
$str = "a nice and sunny day today";
$split = explode(' ', $str);
$final_array = array();
$i = 0;
$string = '';
$spacer = '';
for ($i = 0; $i < count($split); $i++) {
$string .= $spacer . $split[$i];
$final_array[] = $string;
$spacer = ' ';
}
array_map()
和回调函数来实现此目的:
$result = array_filter(array_map(function($k) use($split) {
return implode(' ', array_slice($split, 0, $k));
}, array_keys($split)));
print_r(array_values($result));
输出:
Array
(
[0] => a
[1] => a nice
[2] => a nice and
[3] => a nice and sunny
[4] => a nice and sunny day
)
我倾向于直接的解决方案不应该使用多个循环或多个函数调用(当然是在爆炸之后)。
我将使用
array_map()
演示函数式解决方案。 static
声明允许保留值以供后续迭代期间访问。
var_export(
array_map(
function ($word) {
static $last; // declare persistent variable in scope
$word = ($last ? "$last " : '') . $word; // prepend previous word
return $last = $word; // update $last and return $word (which is identical to $last)
},
explode(' ', $str)
)
);