sql >> Databasteknik >  >> RDS >> Mysql

Hur bygger man om en array utan upprepningar och andra begränsningar?

Här är vad jag till slut kom fram till som fungerade (efter att utan framgång ha försökt bygga frågan som jag behövde för att åstadkomma samma sak)...

Den ursprungliga arrayen $theresults innehåller alla 60 frågor från de 5 olika kategorierna. Jag börjar med att bygga en uppsättning av alla frågekategorier...

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

Sedan använder jag följande funktion för att dra alla unika kombinationer av kategorier...

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

Till sist går jag igenom var och en av kombinationerna för att dra frågor som matchar varje kategori i paret och lagra resultatet i en ny array. (Jag loopar det tre gånger eftersom varje kategoriparning kommer att användas tre gånger (10 kombinationer av frågepar x 3 loopar =60 frågor.) Jag tar också bort varje fråga jag hämtar från den ursprungliga $theresults array för att säkerställa att det inte finns några dubbletter...

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

Förhoppningsvis hjälper detta någon annan!




  1. PHP:mysql-frågan hoppade över/ignoreras efter stora filuppladdningar?

  2. Mysql-servern på MAMP startar inte

  3. Hur inaktiverar man anslutningspoolen?

  4. Kolumn Alias ​​i en WHERE-klausul