从按字数分组的连续单词生成唯一短语数组

问题描述 投票:0回答:2

我正在使用 PHP 的

explode()
设置单词搜索,并计算查询中的空格数以及查询中的单词数。

例如我的用户搜索

Hello world, good morning
(来自用户的查询,可能更多单词)

我得到:

  • 你好
  • 世界
  • 早上

我想将独特的单词集显示为数组,例如:

  1. ['hello world good morning']
  2. ['hello world good', 'world good morning']
  3. ['hello world', 'good morning', 'world good']
  4. ['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);
}
php arrays combinations cpu-word match-phrase
2个回答
1
投票

给你:

$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。我没有费心去清洁琴弦,因为你已经把琴弦练到了可用的程度。


0
投票

使用前瞻模式捕获逐渐变长的子字符串,并将每组匹配添加到结果数组中。

代码:(演示

$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',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.