Chcę wygenerować dwie kombinację słów ze słowa z tą samą kategorią. Przykład mam tę tabelę:

+--------------+----------+
|     Word     | Category |
+--------------+----------+
| human        | social   |
| politic      | social   |
| law          | social   |
| artificial   | science  |
| intelligence | science  |
+--------------+----------+

and I want the output like this:

+-------------------------+----------+
|          Word           | Category |
+-------------------------+----------+
| human-law               | social   |
| human-politic           | social   |
| politic-law             | social   |
| artificial-intelligence | science  |
+-------------------------+----------+

Ale nie mam pojęcia, jak to zrobić. To mój kod, a ten kod połączy wszystkie słowo bez filtra kategorii.

Klasa modelu (MD_Classification):

function getWords(){
    $stat = $this->db->query("SELECT DISTINCT(word), category from tb_words group by word, category");
    return $stat->result_array();
}

function getAllCombinations($array){
    $combinations = array();

    foreach ($array as $x)
        foreach ($array as $y) {
            if ($x != $y && !in_array($y . '-' . $x, $combinations))
                array_push($combinations, $x . '-' . $y);
        }
    return $combinations;
}

Kontroler:

$getWord = $this->md_classification->getWords();

foreach ($getWord as $row) {
    $word[] = $row['word'];
    $category[] = $row['category'];
}
$result = $this->md_classification->getAllCombinations($word);
-1
ran 26 lipiec 2020, 09:27

2 odpowiedzi

Najlepsza odpowiedź

Twoja aktualna funkcja kombinacji zapewni Ci odwrotne duplikaty, ponieważ jest to iteracja na wszystkich indeksach wewnątrz zagnieżdżonej pętli. Myślę, że odpowiedź tutaj używa podstawowego dla pętli w następujący sposób

function getAllCombinations($array){
    $combinations = array();

    for ($i = 0; $i < sizeof($array); $i++)
        for ($j = $i+1; $j < sizeof($array); $j++) 
            if ($array[$i]['category'] == $array[$j]['category'])
                array_push($combinations, $array[$i]['word'] . '-' . $array[$j]['word']);
        
    return $combinations;
}

Zauważ, że funkcja powinna otrzymać tablicę wyników w ten sam sposób, w jaki pochodziło z DB. znaczenie:

$result = $this->md_classification->getAllCombinations($getWord);

Dzięki tej metodzie nie dostaniesz żadnych duplikatów, ponieważ nie czujesz się do tych samych wierszy dwa razy. Mam nadzieję, że pomogło.

0
vlad katz 26 lipiec 2020, 07:14

Mogę poradzić rozwiązanie MySQL dla tego problemu:

select concat(w.Word, ' - ', w1.Word) Words, w.Category
from words w
join words w1 on w.Category = w1.Category
where w.Word < w1.Word
;

Wynik:

+===========================+==========+
| Words                     | Category |
+===========================+==========+
| human - politic           | social   |
+---------------------------+----------+
| law - politic             | social   |
+---------------------------+----------+
| human - law               | social   |
+---------------------------+----------+
| artificial - intelligence | science  |
+---------------------------+----------+

Testuj tutaj kod SQL

0
Slava Rozhnev 23 grudzień 2020, 23:18