Mysql
 sql >> Database >  >> RDS >> Mysql

Come ricostruire un array senza ripetizioni e altri limiti?

Ecco cosa ho finalmente trovato che ha funzionato (dopo aver tentato senza successo di creare la query di cui avevo bisogno per ottenere la stessa cosa)...

L'array originale $theresults contiene tutte le 60 domande delle 5 diverse categorie. Comincio costruendo un array di tutte le categorie di domande...

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

Quindi utilizzo la seguente funzione per estrarre tutte le combinazioni univoche di categorie...

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

Infine, eseguo ciascuna delle combo per estrarre domande che corrispondono a ciascuna categoria nella coppia e memorizzare il risultato in una nuova matrice. (Lo metto in loop tre volte perché ogni abbinamento di categoria verrà utilizzato tre volte (10 combinazioni di coppie di domande x 3 loop =60 domande.) Rimuovo anche ogni domanda che estraggo dall'originale $theresults array per assicurarsi che non ci siano duplicati...

// 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']]);
    }
}

Speriamo che questo aiuti qualcun altro!