Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment reconstruire un tableau sans répétitions et autres limites ?

Voici ce que j'ai finalement trouvé qui a fonctionné (après avoir tenté sans succès de créer la requête dont j'avais besoin pour accomplir la même chose)...

Le tableau d'origine $theresults contient les 60 questions des 5 catégories différentes. Je commence par construire un tableau de toutes les catégories de questions...

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

Ensuite, j'utilise la fonction suivante pour extraire toutes les combinaisons uniques de catégories...

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

Enfin, je parcours chacun des combos pour extraire les questions qui correspondent à chaque catégorie de la paire et stocker le résultat dans un nouveau tableau. (Je le boucle trois fois car chaque appariement de catégorie sera utilisé trois fois (10 combinaisons de paires de questions x 3 boucles =60 questions.) Je supprime également chaque question que je tire de l'original $theresults tableau pour s'assurer qu'il n'y a pas de doublons...

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

J'espère que cela aidera quelqu'un d'autre !