Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    28

    algoritmo combinatorio fra array

    Salve ragazzi. Premetto che ho cercato per ore nel forum e nel web, ma non sono riuscito a trovare nulla che faccia al caso mio. E' possibile, anzi probabile, che io sia troppo stupido o troppo ignorante per capire l'informatica a questi livelli di astrazione (permutazioni, calcolo combinatorio...: affascinante, ma mi dà il mal dimare ).

    Ho trovato divesi snippet e una classe intera che consentono di generare tutte le combinazioni possibili trai valori di un array, ma... Ma io devo fare qualcosa di leggermente diverso. Senza sapere a priori con quanti array avrò a che fare né di quali dimensioni saranno, cioè senza sapere da quanti elementi saranno composti, ma sapendo che saranno comunque di dimensioni diverse, vorrei scrivere una routine in grado di combinare ciascun valore di ogni array con ciascun valore di tutti gli altri array.

    Faccio un esempio.

    Supponiamo di avere tre array

    Codice PHP:
    $arr1 = array("buono""cattivo");
    $arr2 = array("ghiacciato""freddo""tiepido""caldo");
    $arr3 = array("liquido""solido""gelatinoso"); 
    Dati questi array, di cui - ripeto - io non so nulla nel momento in cui scrivo il codice, avrei bisogno di una routine che mi estragga le combinazioni possibili dandomi i seguenti risulatati

    Codice PHP:
    buono-ghiacciato-liquido
    buono
    -freddo-liquido
    buono
    -tiepido-liquido
    buono
    -caldo-liquido
    buono
    -ghiacciato-solido
    buono
    -freddo-solido
    buono
    -tiepido-solido
    buono
    -caldo-solido
    buono
    -ghiacciato-gelatinoso
    buono
    -freddo-gelatinoso
    buono
    -tiepido-gelatinoso
    buono
    -caldo-gelatinoso 
    E così via con il cattivo. Inutile dire che non ci devono essere ripetizioni e che non devono essere combinati tra loro gli elòementi del medesimo array.

    Mentre scrivo, mi viene in mente che potrei usare un algoritmo che combina gli elementi di un array dopo aver fatto un array_merge_recursive sui miei array, ma dopo dovrei trovare il modo di eliminare le combinazioni degli elementi provenienti dallo stesso array: da manicomio, e pure decisamente inelegante.

    Qualcuno sa darmi una dritta.
    Grazie di cuore

  2. #2
    Se si tratta olo di 3 array basta:
    Codice PHP:
    foreach ($arr1 as $v1)
      foreach (
    $arr2 as $v2)
          foreach (
    $arr3 as $v3)
             
    $arr4[]="$v1-$v2-$v3";

    print_r($arr4); 
    Altrimenti devvi fare una matrice ed una funzione ricorsiva
    Fidatevi del dottor Auz!
    http://dottorauz.blogspot.com

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    28
    Sì, il loop annidato l'avevo capito, ma come ho scritto, non posso sapere in anticipo quanti array devo elaborare né quanti elementi per array: il codice postato era solo un esempio.

    Per quel che riguarda la matrice e la funzione ricorsiva, è vero: fa un bel suono...

    Scherzi a parte, se potessi illustrarmi di cosa si tratta: nel senso che so che cos'è una funzione ricorsiva e so che è difficile scriverne una senza incorrere in loop infiniti, ma la matrice non so cosa sia...

    Grazie per la risposta

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    28
    Ooops! Dunque una matrice non è altro che un array? Bene. Quindi, se ho capito bene, devo creare un array di array e poi scorrere recursivamente. Qualcosa del genere l'ho fatto (usando script reperiti in rete, io sono al di sotto di queste cose), ma il fatto è che mivengono associati anche gli elementi di ogni singoo array tra loro. Mi risulta cioè, tornando all'esempio di prima, una stringa 'buono-cattivo', 'ghiacciato-freddo-tiepido-caldo' e così via, cosa che, come è facile intuire, non è desiderabile.

    Insomma, non so scrivere la funzione ricorsiva che unisca ogni elemento di ogni array con ogni elemento di tutti gli altri array. Ossia, se gli array fossero 4, ogni combinazione risultante dalla funzione dovrebbe essere composta da 4 valori, né più né meno; ogni risultato dovrebbe essere unico; l'insieme dei risultati dovrebbe esaurire la totalità delle combinazioni possibili.

    Se immaginiamo due array (per rendere le cose semplici), potremmo avere

    Codice PHP:
    array1 = array("01""02");
    array2 = array("01""02""03");

    risultato della funzione;

    0101
    0102
    0103
    0201
    0202
    0203 
    Questo senza conoscere a priori né il numero né la dimensione degli array in gioco.

    Spero di essermi spiegato

    Grazie mille ancora per la risposta

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    28
    Allora: questo è quello che sono riuscito a fare:

    Codice PHP:
    //dati tre array
    $arr0 = array("01""02""03");
    $arr1 = array("uno""due""tre""quattro");
    $arr2 = array("verde""bianco""rosso");

    //creo un nuovo array di array
    $arrG[0] = $arr0;
    $arrG[1] = $arr1;
    $arrG[2] = $arr2;

    //scrivo funzione
    function createcode($listOfArray){
        foreach (
    $listOfArray as $k=>$v){
            if (
    is_array($v)){
                foreach (
    $v as $c){
                    
    $code .= $c;
                }
            }else{
                
    $code .= $v;
            }
            echo 
    "code is " $code "
    "
    ;
        }
    }

    //OUTPUT sbagliato

    code is 010203
    code is 010203unoduetrequattro
    code is 010203unoduetrequattroverdebiancorosso 
    Aiut!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    28
    Qualcosina di meglio:

    Codice PHP:
    //array
    $arr0 = array("01""02""03");
    $arr1 = array("uno""due""tre""quattro");
    $arr2 = array("verde""bianco""rosso");

    //funzione ricorsiva
    function createcode($listOfArray){
        
    $i=0;
        foreach (
    $listOfArray as $v){
            if (
    is_array($v)){
                
    $tArr $v;
                
    $code .= $tArr[$i];
                
    $i++;
                if (
    $v != $tArr){
                    
    createCode($v);
                }
            }else{
                
    $code .= $v;
            }
            echo 
    "code is " $code "
    "
    ;
        }
    }

    //output sbagliato
    code is 01
    code is 01due
    code is 01duerosso 
    Perché è meglio di prima? Perché adesso almeno una combinazione me la dà: 01duerosso!
    Ci diventerò vecchio, vedrete!

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    28

    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:
    <?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)."
    "
    ;
        }
        
    $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.
    Ciao a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.