Quiero generar una combinación de dos palabras a partir de la palabra con la misma categoría. Ejemplo tengo esta tabla:

+--------------+----------+
|     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  |
+-------------------------+----------+

Pero no tengo ni idea de cómo hacer eso. Este es mi código, y este código simplemente combina todas las palabras sin filtro de categoría.

Clase de modelo (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;
}

Controlador:

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

foreach ($getWord as $row) {
    $word[] = $row['word'];
    $category[] = $row['category'];
}
$result = $this->md_classification->getAllCombinations($word);
-1
waytogo 26 jul. 2020 a las 09:27

2 respuestas

La mejor respuesta

Su función get Combinations actual le dará duplicados inversos ya que está iterando en todos los índices dentro de un ciclo anidado. Creo que la respuesta aquí es usar un bucle for básico de la siguiente manera

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;
}

Observe que la función debe recibir la matriz de resultados de la misma manera que proviene de la base de datos. significado:

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

Con este método, no obtendrá ningún duplicado ya que no iterará en las mismas filas dos veces. Espero que haya ayudado.

0
vlad katz 26 jul. 2020 a las 07:14

Puedo recomendar la solución MySQL para este problema:

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
;

Resultado:

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

prueba el código SQL aquí

0
Slava Rozhnev 23 dic. 2020 a las 23:18