Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como reconstruir uma matriz sem repetições e outros limites?


Aqui está o que eu finalmente consegui que funcionou (depois de tentar sem sucesso construir a consulta que eu precisava para realizar a mesma coisa) ...

A matriz original $theresults contém todas as 60 perguntas das 5 categorias diferentes. Começo construindo uma matriz de todas as categorias de perguntas...
// Create array of all categories
$allcategories = array();
$this->db->select('category_id');
$this->db->where('template_id',$template_id);
$query_thecategories = $this->db->get('categories');
$number_thecategories = $query_thecategories->num_rows();
if ($number_thecategories>0) {
    foreach ($query_thecategories->result() as $row_thecategory) {
        $thecategory = 'cat_' . $row_thecategory->category_id;
        $$thecategory = '0';
        $allcategories[] = $row_thecategory->category_id;
    }
}

Então eu uso a seguinte função para puxar todas as combinações únicas de categorias...
function array_search_by_key($array, $key, $value) {
    if(!is_array($array)) {
        return [];
    }
    $results = [];
    foreach($array as $element) {
        if(isset($element[$key]) && $element[$key] == $value) {
            $results[] = $element;
        }
    }
    return $results;
}

$uniquecombos = uniquecombos($allcategories, 2);

Por fim, percorro cada um dos combos para extrair perguntas que correspondam a cada categoria do par e armazenar o resultado em uma nova matriz. (Eu faço um loop três vezes porque cada pareamento de categorias será usado três vezes (10 combinações de pares de perguntas x 3 loops =60 perguntas.) Eu também removo cada pergunta extraída do $theresults original array para garantir que não haja duplicatas ...
// Create an empty array to capture the paired questions
$pairs = array();

// Loop through unique combos array 3 times to build pairings
for($combos = 1; $combos <= 3; $combos++) {
    foreach ($uniquecombos as $theset) {
        // Get two categories in pair
        $firstcategory = $theset[0];
        $secondcategory = $theset[1];

        // Gather other arrays which matches each category
        $matchesfirst = array_search_by_key($theresults,'category_id',$firstcategory);
        shuffle($matchesfirst);
        $matchessecond = array_search_by_key($theresults,'category_id',$secondcategory);
        shuffle($matchessecond);

        // Get question from each new array & add; remove selected question from the original array
        $pairs[] = $matchesfirst[0];
        unset($theresults[$matchesfirst[0]['question_id']]);
        $pairs[] = $matchessecond[0];
        unset($theresults[$matchessecond[0]['question_id']]);
    }
}

Espero que isso ajude outra pessoa!