我正在使用 PHP 的
explode()
设置单词搜索,并计算查询中的空格数以及查询中的单词数。
例如我的用户搜索
Hello world, good morning
(来自用户的查询,可能更多单词)
我得到:
我想将独特的单词集显示为数组,例如:
['hello world good morning']
['hello world good', 'world good morning']
['hello world', 'good morning', 'world good']
['hello', 'world', 'good', 'morning']
对于1和4我可以解决它,但是对于2和3它很难解决。
$oriSearch = 'Hello world, good morning';
$search_query = trim(strtolower($oriSearch));
$search_query = preg_replace_callback('#([\W_]+)#', function() {
return ' ';
}, $search_query);
$totalSpace = substr_count($search_query, ' ');
$totalWord = ceil($totalSpace+1);
if($totalSpace > 0)
{
$wordPlode = explode(' ', $search_query);
$wordQuery = array();
for($i=1;$i<=$totalWord;$i++)
{
if($i == $totalWord)
{
$wordQuery[] = $search_query;
}
else if($i == 1) {
$wordQuery[] = $wordPlode;
}
else
{
//Here I need
}
}
echo var_dump($wordQuery);
}
给你:
$clean_string = 'hello world good morning';
$array = explode(' ',$clean_string);
$len = count($array);
for($i=1; $i<=$len; ++$i){
$output[] = array_map(function($a) use($i,$array){
if(count($a) != $i) $a = array_slice($array, -$i);
return implode(' ', $a);
},array_chunk($array,$i));
}
print_r($output);
输出
Array
(
[0] => Array
(
[0] => hello
[1] => world
[2] => good
[3] => morning
)
[1] => Array
(
[0] => hello world
[1] => good morning
)
[2] => Array
(
[0] => hello world good
[1] => world good morning
)
[3] => Array
(
[0] => hello world good morning
)
)
显然,如果您希望以其他方式排序,您可以从数组的计数开始并递减它(在 for 循环中)。
像这样:
for($i=$len; $i>0; --$i)
$output[] = array_map(function($a) use($i,$array){
if(count($a) != $i) $a = array_slice($array, -$i);
return implode(' ', $a);
},array_chunk($array,$i));
输出结果与上面的正好相反。
厚实!
这是非常简单的数组块,它将采用一个数组(来自爆炸,单个单词)并使其在块大小(
$i
)中成为多维,这是基于数组的长度。
然后我们可以对子数组进行数组映射,如果它们的长度是
$i
的长度,如果它们不是(奇数与偶数处理),这仅发生在数组的末尾,我们可以使用带有负数的数组切片$i
(我们想要的长度)来填充它。负数从数组的末尾开始。
例如,当我们在上面的输出中对数组 #2 进行分块时,我们会在 for 循环中得到这个:
# index 2 from above output
#explode
array("hello", "world", "good", "morning")
#array_chunk
Array
(
[0] => array("hello", "world", "good")
[1] => array("morning")
)
#array_slice
Array
(
[0] => array("hello", "world", "good")
[1] => array("world", "good", "morning")
)
#implode
Array
(
[0] => "hello world good"
[1] => "world good morning"
)
这只是
1
而不是 3
($i
的值),所以我们获取原始数组并从末尾将其切片为 3 个项目。 ['world', 'good', 'morning']
并使用它。
然后,当我们将这两者都内爆时,我们就得到了我们想要的东西。
PS。我没有费心去清洁琴弦,因为你已经把琴弦练到了可用的程度。
使用前瞻模式捕获逐渐变长的子字符串,并将每组匹配添加到结果数组中。
代码:(演示)
$string = 'hello world good morning';
$result = [];
$i = 0;
while (preg_match_all("/(?=\b(\w+(?: \w+){{$i}})\b)/", $string, $m)) {
array_unshift($result, $m[1]);
++$i;
}
var_export($result);
输出:
array (
0 =>
array (
0 => 'hello world good morning',
),
1 =>
array (
0 => 'hello world good',
1 => 'world good morning',
),
2 =>
array (
0 => 'hello world',
1 => 'world good',
2 => 'good morning',
),
3 =>
array (
0 => 'hello',
1 => 'world',
2 => 'good',
3 => 'morning',
),
)