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

Hvordan genopbygger man et array uden gentagelser og andre grænser?

Her er, hvad jeg endelig fandt på, der virkede (efter at have forsøgt uden held at bygge den forespørgsel, jeg havde brug for for at opnå det samme)...

Det originale array $theresults indeholder alle 60 spørgsmål fra de 5 forskellige kategorier. Jeg begynder med at bygge en række af alle spørgsmålskategorierne...

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

Så bruger jeg følgende funktion til at trække alle de unikke kombinationer af 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);

Til sidst går jeg gennem hver af kombinationerne for at trække spørgsmål, der matcher hver kategori i parret, og gemmer resultatet i et nyt array. (Jeg sløjfer det tre gange, fordi hver kategoriparring vil blive brugt tre gange (10 kombinationer af spørgsmålspar x 3 sløjfer =60 spørgsmål). Jeg fjerner også hvert spørgsmål, jeg trækker fra de originale $theresults array for at sikre, at der ikke er nogen dubletter...

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

Forhåbentlig hjælper dette en anden!




  1. Hvordan dræber/stopper man en lang SQL-forespørgsel med det samme?

  2. Er PL/SQL sproget man skal lære, hvis man har Oracle 11g?

  3. Hvordan fungerer NOT IN underforespørgsel med NULL-værdier?

  4. Mysql Slow Insert