algoritmo combinatorio fra array

  • Creatore Discussione Creatore Discussione rup3rto
  • Data di inizio Data di inizio

rup3rto

Nuovo Utente
21 Gen 2010
4
0
0
Salve a tutti.
Vi espongo il mio problema. Supponiamo di avere un indefinito numero di array e di voler ottenere tutte le combinazioni
possibili tra ciascun elemento di ciascun array e ciascun elemento di ogni altro array. Un esempio chiarirà meglio la questione.

Codice:
$a1 = array("01", "02");
$a2 = array("bianco", "verde");
$a3 = array("uno", "due", "tre");

Io voglio ottenere le seguenti combinazioni

01 uno verde
01 due verde
01 tre verde
01 uno bianco
01 due bianco
01 tre bianco
02 uno verde
02 due verde
02 tre verde
02 uno bianco
02 due bianco
02 tre bianco

Per ora sono riuscito ad ottenere questo

creo un array di array
Codice:
$aG[0] = $arr0;
$aG[1] = $arr1;
$aG[2] = $arr2;

e lo passo ad una funzione

Codice:
createCode6($aG);

La funzione è:

Codice:
function createCode6($listOfArray){
    $i = 0;
    $len = sizeof($listOfArray);
    while ($i < $len){
        for ($y=0;$y<sizeof($listOfArray[0]);$y++){
            $code = array();
            $code[] = $listOfArray[0][$y];
            for ($x=1;$x<$len;$x++){
                $code[] = $listOfArray[$x][$i];
            }
            echo implode('',$code);
            echo "<br>";
        }
        $i++;
    }
}

Si ottiene il seguente risultato

01unoverde
02unoverde
01duebianco
02duebianco
01tre
02tre

Qualcuno ha uqlache idea o suggerimento? Fin'ora ho trovato solo algoritmi combinatori che danno tutte le combinazioni possibili (con o senza ripetizioni) tra gli elementi di un singolo array.

Gratitudine eterna per chiunque mi dia una dritta
Ciao
 
Ultima modifica:
Tre domande.
1) perché usi sizeof al posto di count, è un alias di quest'ultima, va bene che dovrebbe essere uguale dato l'alias, comunque è solo curiosità.
2) perché svuoti l'array $code ad ogni iterazione del ciclo che usa $y?
3) perché devi fare questa cosa?

Provaa guardare anche Merge Recursive e Merge forse rispondono al caso tuo.
 
Tre domande.
1) perché usi sizeof al posto di count, è un alias di quest'ultima, va bene che dovrebbe essere uguale dato l'alias, comunque è solo curiosità.
In realtà non c'è un motivo particolare, ma mi sembra ininfluente, no?

2) perché svuoti l'array $code ad ogni iterazione del ciclo che usa $y?
Perché ho bisogno che le combinazioni risultanti dalla funzione siano costituite da tanti elementi quanti sono gli array che compongono l'array che le viene passato. Questo numero non lo conosco a priori, viene stabilito in una parte precedente del programma. Nell'esempio io stampo a video ogni codice, nella realtà ogni codice ottenuto sarà memorizzato in un ulteriore array di codici completi.
3) perché devi fare questa cosa?
Ho sviluppato un programma che consente all'utente di gestire vendite e magazzino dei suoi prodotti. Per ogni prodotto, l'utente può decidere la struttura del codice-prodotto. Supponi che il prodotto in questione sia la vite, e che questa vite possa essere autofilettante o no, a stella o no, lunga o corta. Per ognuna di queste caratteristiche l'utente sceglie due valori alternativi che comporranno il codice prodotto:
af = autofilettante
nm = normale
01= stella
02 = non a stella (non so come si chiama e non me ne frega niente)
sm = corta
xl = lunga
Ogni codice prodotto sarà quindi composto da tre unità ognuna delle quali descrive una caratteristica della nostra vite.
Dai vari codici-prodotto della vite si creeranno i codici a barre e verranno inseriti in una tabella del db. Attualmente, l'utente deve effettuare questa operazione manualmente: il programma gli presenta un form con delle select che contengono i diversi valori possibili per ognuna delle caratteristiche della vite, l'utente sceglie la combinazione e clicca su OK: Il programma a questo punto crea il codice a barre, ne salva l'immagine in una cartella e memorizza i dati in db.
Bene io vorrei automatizzare questo procedimento

Prova a guardare anche Merge Recursive e Merge forse rispondono al caso tuo.
Guarderò subito e grazie mille per la risposta
 
No, mi sembra che le funzioni merge e merge_recursive non c'entrino nulla: queste non combinano gli elementi di diversi array ma li riuniscono in un unico array.
Grazie lo stesso.

Ciao
 
Solved

La soluzione l'ha cortesemente fornita l'utente aneesme di forums.devshed.com Il codice è il seguente e devo ammettere che io ero totalmente fuori strada:
Codice:
<?php
function generateCodes($arr) {
    $pos = 0;
    global $codes, $pos;
    if(count($arr)) {
        for($i=0; $i<count($arr[0]); $i++) {
            $tmp = $arr;
            $codes[$pos] = $arr[0][$i];
            $tarr = array_shift($tmp);
            $pos++;
            generateCodes($tmp);

        }
    } else {
        echo join("", $codes)."<br/>";
    }
    $pos--;
}
$a0 = array("01", "02");
$a1 = array("uno", "due", "tre");
$a2 = array("verde", "bianco");
$aG = array($a0, $a1, $a2);
$codes = array();
$pos = 0;
generateCodes($aG);

?>

Funziona egregiamente.:fonzie:
Ciao a tutti
 
Ultima modifica:

Discussioni simili