Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann man ein Array ohne Wiederholungen und andere Einschränkungen neu erstellen?

Hier ist, was ich endlich herausgefunden habe, das funktioniert hat (nachdem ich erfolglos versucht hatte, die Abfrage zu erstellen, die ich brauchte, um dasselbe zu erreichen) ...

Das ursprüngliche Array $theresults enthält alle 60 Fragen aus den 5 verschiedenen Kategorien. Ich beginne damit, ein Array aller Fragekategorien zu erstellen...

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

Dann verwende ich die folgende Funktion, um alle einzigartigen Kombinationen von Kategorien abzurufen...

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

Zuletzt durchlaufe ich jede der Kombinationen, um Fragen zu ziehen, die jeder Kategorie im Paar entsprechen, und speichere das Ergebnis in einem neuen Array. (Ich schleife es dreimal, weil jede Kategoriepaarung dreimal verwendet wird (10 Kombinationen von Fragenpaaren x 3 Schleifen =60 Fragen). Ich entferne auch jede Frage, die ich aus den ursprünglichen $theresults ziehe Array, um sicherzustellen, dass es keine Duplikate gibt...

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

Hoffentlich hilft das jemand anderem!