Я пытаюсь создать инструмент, который может повернуть вращение контента.
Ниже вы можете увидеть, что такое вращение контента:
{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}.
Эта проблема :
Представьте, что у меня есть 500 результатов в моей базе данных, как я могу отменить эти 500 результатов, чтобы сделать один спин-предложение как это ?
{Max | He} {taps | raps | thumps | барабаны} его {карандаш | ручка | палец} {против | на} {его | the} {стол | стол | письменный стол} и {жует | жует | грызет} жвачка {когда | пока} {он | он} {скучно | устал | ленивый}.
Спасибо за ваше время !
С 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";
Других решений пока нет …