algoritmo combinatorio fra array

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:

MarcoGrazia

Utente Attivo
15 Dic 2009
852
20
28
62
Udine
www.stilisticamente.com
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.
 

rup3rto

Nuovo Utente
21 Gen 2010
4
0
0
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
 

rup3rto

Nuovo Utente
21 Gen 2010
4
0
0
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
 

rup3rto

Nuovo Utente
21 Gen 2010
4
0
0
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
Autore Titolo Forum Risposte Data
Tommy03 Algoritmo classifica SQL MySQL 0
G Richiesta consigli SEO: nuovo algoritmo Google (e altro) SEO e Posizionamento 2
lidya123 ALGORITMO per trasformare/mappare/coordinare Tocchi tra Tablet e Desktop PC Programmazione 0
M [PHP] Algoritmo matematica PHP 8
M [PHP] Algoritmo con parametri PHP 1
M [PHP] Algoritmo con struttura iterativa PHP 2
M [PHP] Testing algoritmo PHP 2
M [PHP] Problema con algoritmo struttura iterativa PHP 2
S [PHP] Algoritmo log in e out PHP 2
D [Retribuito][Offro] implementazione algoritmo ricerca locale Offerte e Richieste di Lavoro e/o Collaborazione 1
G Problema con algoritmo ricorsivo [backtracking] java Java 0
felino 'Scambio link': penalizzante con il nuovo algoritmo di Google SEO e Posizionamento 0
A Algoritmo NDiff, problema con gli attributi Programmazione 0
M Algoritmo per raggruppamento MySQL 0
V Algoritmo di Dijkstra..! PHP 16
M Algoritmo calcolo costo risorse e tempo di costruzione PHP 4
N [PHP] Algoritmo per Aste al ribasso PHP 6
R Algoritmo Branch and Bound Programmazione 1
S Algoritmo Programmazione 18
G scomponi un numero intero come la somma di 20 numeri interi casuali maggiori di zero diversi fra loro Javascript 1
D Risultati diversi elaborazione dati fra localhost e Altervista PHP 0
MarcoGrazia Calcolo fra due date con esclusione delle feste PHP 7
T differenza fra mysql xampp e un mysql server Database 0
R Includere elementi array fra apici PHP 1
maxnegri Conoscere giorni della settimana fra due date con php PHP 2
andrea.peo Calcolo differenza fra record attivo e precedente PHP 1
M Calcoli fra orari (in formato ore:minuti) PHP 2
D Navigare fra le directory e aprire file PHP 3
P due select che non vanno d'accordo fra di loro PHP 4
Gabriele Visioli Domanda: rapporto fra Visite e Traffico Hosting 3
S Aggiornare campo in base a timestamp meno recente fra piu tabelle PHP 2
D calcolo fra date php PHP 2
F distanza verticale fra elementi HTML e CSS 1
I Socket > Cominicazione fra due host Flash 3
M Creazione di una videoteca in collegamento fra Access 2003 e Microsoft Visual Web Dev ASP.NET 1
M Cancellare tutti i caratteri fra due caratteri PHP 6
R problema confronto fra date PHP 2
B Creazione sito con videoconferenze, report, db appuntamenti fra sedi differenti PHP 9
G Differenza fra due date PHP 5
T Countdown fra 2 date in ASP Classic ASP 12
T inserire _POST fra le virgolette per definire una variabile PHP 11
M Problema del trasferimento file fra server PHP 4
S consiglio per ottimizzare copia dati fra diversi DB Database 0
M [MySQL] confronto fra date Database 1
JellyBelly Gmap - calcolare distanza fra due maker Javascript 0
V conflitto fra due js Javascript 2
M link fra diverse parti di un sito Flash 3
G differenza fra apici e doppi apici PHP 2
G Inserire una trasparenza fra trama e testo in CSS? HTML e CSS 2
G Come parificare l'interlinea in CSS fra i browser? HTML e CSS 0

Discussioni simili