Как повернуть спиннинг контента

Я пытаюсь создать инструмент, который может повернуть вращение контента.

Ниже вы можете увидеть, что такое вращение контента:

{Max|He} {taps|raps|thumps|drums} his {pencil|pen|finger} {against|on} {his|the} {desk|table|writing desk} and {chews|chews on|gnaws on} gum {when|while} {he’s|he is} {bored|tired|lazy}.

введите описание изображения здесь

  1. КРАСНЫЙ: «Макс стучит пальцем по столу и грызет жвачку, когда ему лень».
  2. СИНИЙ: «Он стучит карандашом по столу и жует жвачку, пока он устал».

Эта проблема :

Представьте, что у меня есть 500 результатов в моей базе данных, как я могу отменить эти 500 результатов, чтобы сделать один спин-предложение как это ?

{Max | He} {taps | raps | thumps | барабаны} его {карандаш | ручка | палец} {против | на} {его | the} {стол | стол | письменный стол} и {жует | жует | грызет} жвачка {когда | пока} {он | он} {скучно | устал | ленивый}.

Спасибо за ваше время !

1

Решение

С postgresql:

create TABLE tbl (c TEXT);
INSERT INTO tbl(c)
VALUES  ('Max taps his pencil')
,('Max raps his pencil')
,('Max raps his drums')
,('Max raps his drums pencil')
;

SELECT nr, ARRAY_AGG(DISTINCT elem) FROM (
SELECT
elem,
row_number()
OVER (PARTITION BY id) AS nr
FROM (SELECT
id,
regexp_split_to_table(c, ' ') AS elem
FROM tbl) x
) a GROUP BY nr;

Возвращает:

1,{Max}
2,{raps,taps}
3,{his}
4,{drums,pencil}
5,{pencil}

Присоединиться результат для ответа

SELECT string_agg(
CASE WHEN 2 > array_length(w,1) THEN w[1]::TEXT
ELSE '{'||array_to_string(w,'|')||'}'
END
,' ') FROM (SELECT nr, ARRAY_AGG(DISTINCT elem) as w FROM (
SELECT
elem,
row_number()
OVER (PARTITION BY id) AS nr
FROM (SELECT
id,
regexp_split_to_table(c, ' ') AS elem
FROM tbl) x
) a GROUP BY nr ORDER BY nr
) b
;

Retuns: Max {raps|taps} his {drums|pencil} pencil

Решение PHP:

/*Read this from database*/
$in = array('Max taps his pencil'
,'Max raps his pencil'
,'Max raps his drums'
,'Max raps his drums pencil');

$statWordsAtIndex = [];

$addWordAtIndex = function ($word,$index) use (&$statWordsAtIndex) {
if ( !array_key_exists($index,$statWordsAtIndex) ) {
$statWordsAtIndex[$index] = [$word];
}
else if (!in_array($word,$statWordsAtIndex[$index]) ) {
$statWordsAtIndex[$index][] = $word;
}
};
foreach ($in as $sid => $sentence) {
$words = explode(' ',$sentence);
foreach ($words  as $pos => $word) {
$addWordAtIndex($word,$pos);
}
}
foreach ($statWordsAtIndex as $words) {
if (2 > count($words) ) {
echo $words[0],' ';
}
else {
echo '{',implode('|',$words),'} ';
}
}
echo "\n";
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]