Combinazioni tra array multidimensionali

  • Creatore Discussione Creatore Discussione m4tt86
  • Data di inizio Data di inizio

m4tt86

Nuovo Utente
13 Mar 2009
9
0
0
Ciao ragazzi,
ho un array di questo tipo:

PHP:
$arraytmp[1][1] = array("NOME"=>'test array 1',"TIPO"=>'5');
$arraytmp[1][2] = array("NOME"=>'test array 2',"TIPO"=>'6');
$arraytmp[1][3] = array("NOME"=>'test array 3',"TIPO"=>'9');

$arraytmp[2][1] = array("NOME"=>'test array 4',"TIPO"=>'3');
$arraytmp[2][2] = array("NOME"=>'test array 5',"TIPO"=>'2');
$arraytmp[2][3] = array("NOME"=>'test array 6',"TIPO"=>'8');

Quello che devo fare è combinare gli elementi in questo modo generando un nuovo array con struttura identica a questa:

PHP:
$arraytmp[1][1] = array("NOME"=>'test array 1',"TIPO"=>'5');
$arraytmp[2][1] = array("NOME"=>'test array 4',"TIPO"=>'3');

$arraytmp[1][1] = array("NOME"=>'test array 1',"TIPO"=>'5');
$arraytmp[2][2] = array("NOME"=>'test array 5',"TIPO"=>'2');

$arraytmp[1][1] = array("NOME"=>'test array 1',"TIPO"=>'5');
$arraytmp[2][3] = array("NOME"=>'test array 6',"TIPO"=>'8');

$arraytmp[1][2] = array("NOME"=>'test array 2',"TIPO"=>'6');
$arraytmp[2][1] = array("NOME"=>'test array 4',"TIPO"=>'3');

$arraytmp[1][2] = array("NOME"=>'test array 2',"TIPO"=>'6');
$arraytmp[2][2] = array("NOME"=>'test array 5',"TIPO"=>'2');

$arraytmp[1][2] = array("NOME"=>'test array 2',"TIPO"=>'6');
$arraytmp[2][3] = array("NOME"=>'test array 6',"TIPO"=>'8');

$arraytmp[1][3] = array("NOME"=>'test array 3',"TIPO"=>'9');
$arraytmp[2][1] = array("NOME"=>'test array 4',"TIPO"=>'3');

$arraytmp[1][3] = array("NOME"=>'test array 3',"TIPO"=>'9');
$arraytmp[2][2] = array("NOME"=>'test array 5',"TIPO"=>'2');

$arraytmp[1][3] = array("NOME"=>'test array 3',"TIPO"=>'9');
$arraytmp[2][3] = array("NOME"=>'test array 6',"TIPO"=>'8');

Come posso fare? Confido in un vostro aiuto :-)

Grazie
m4tt86
 
infatti è questo quello che devo fare, solo che non conosco a priori gli elementi degli array e nemmeno gli indici perchè sono variabili.
 
ciao
non sperare in una soluzione, ma cerco di darti un primo input, se come hai detto il numero degli indici è variabile per prima cosa trovare come sono distribuiti, l'idea per vedere come è questa

PHP:
<?php
$arraytmp[1][1] = array("NOME"=>'test array 1',"TIPO"=>'5'); 
$arraytmp[1][2] = array("NOME"=>'test array 2',"TIPO"=>'6'); 
$arraytmp[1][3] = array("NOME"=>'test array 3',"TIPO"=>'9');
//aggiunto questo sotto per prova
$arraytmp[1][4] = array("NOME"=>'test array 7',"TIPO"=>'7');

$arraytmp[2][1] = array("NOME"=>'test array 4',"TIPO"=>'3'); 
$arraytmp[2][2] = array("NOME"=>'test array 5',"TIPO"=>'2'); 
$arraytmp[2][3] = array("NOME"=>'test array 6',"TIPO"=>'8');
//aggiunto questo sotto per prova
$arraytmp[3][1] = array("NOME"=>'test array 6',"TIPO"=>'8');
$array_1=count($arraytmp);
echo "gli array consederando solo il primo indice sono ".$array_1."<br>";

for($k=1; $k<=$array_1;$k++){
	$array_2[$k]=$array_2[$k]+count($arraytmp[$k]);
	echo "di cui con indice [$k] sono $array_2[$k] <br>";
}//fine for
?>

di più non posso perchè ho i pc che mi stanno dando i numeri, sapendo come sono usnado cicli su cicli ti pui crere un altro arrayo ordinato come vuoi tu (penso)
 
Ciao borgo italia,
intanto grazie per il tuo aiuto! Quello che hai postato tu permette di contare gli elementi presenti in ogni array con indice uguale, potresti darmi un'altro aiutino su come calcolare le possibili combinazioni? Anche se mi spieghi la logica poi ci penso io allo sviluppo.
 
ciao
non mi sono dimenticato, ma in questi giorni come detto ho dei problemini con i pc.
comunque prima di prcedere dovrei capire quello che vuoi fare.
ti allego un documento zip(doc) con degli esempi, fammi sapere se è quello che vuoi.
comunque non è semplice trovare la logica (almeno così mi sembra)
 
Ciao borgo italia,
intanto voglio ringraziarti per la tua grande disponibilità, questo ti fa onore!
Grazie alla rete e effettuando alcune modifiche, sono riuscito a risolvere. Posto il codice, così se qualcuno avrà il mio stesso problema potrà risolverlo in un attimo :-)


Se avete una soluzione più pulita e che consuma meno risorse sarà ben accetta!


PHP:
$n_camere=2;
$arraytmp[0][0] = array("NOME"=>'test array 1',"TIPO"=>'5');
$arraytmp[0][1] = array("NOME"=>'test array 2',"TIPO"=>'6');
$arraytmp[0][2] = array("NOME"=>'test array 3',"TIPO"=>'9');

$arraytmp[1][0] = array("NOME"=>'test array 4',"TIPO"=>'3');
$arraytmp[1][1] = array("NOME"=>'test array 5',"TIPO"=>'2');
$arraytmp[1][2] = array("NOME"=>'test array 6',"TIPO"=>'8');


echo "VALORI ORIGINALI:";
echo "<br />";

for($b=0;$b<$n_camere;$b++) {
	for($c=0;$c<count($arraytmp[$b]);$c++) {
		echo $arraytmp[$b][$c]['NOME'] ."<br />";
	}
	echo "-----------------------<br />";

}

function generateCodes($arr) {
	
    $pos = 0;
    global $arrFinal, $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 {
        
        array_push($arrFinal, $codes);
        
    }
    $pos--;
}

echo "<br />";
echo "COMBINAZIONI:";
echo "<br />";

$aG = array();
for($j=0;$j<$n_camere;$j++) {
	$aG[]=$arraytmp[$j];
}

$codes = array();
$arrFinal = array();
$pos = 0;
generateCodes($aG);
foreach ($arrFinal as $key => $value){
	foreach ($value as $keyroom => $valueroom){
			echo /*$keyroom . " " .*/$valueroom['NOME']."<br />";
	}
	echo "-----------------------<br />";
}
 
ciao
...sono riuscito a risolvere. Posto il codice, così se...
perfetto
così dovrebbero comportarsi tutti i forumisti

dimenticavo
al posto di $n_camere=2;
metti DOPO GLI ARRAY
$n_camere=count($arraytmp);
così funzia anche se i gruppi sono 3 o più, es.

$arraytmp[0][0] = array("NOME"=>'test array 1',"TIPO"=>'5');
$arraytmp[0][1] = array("NOME"=>'test array 2',"TIPO"=>'6');
$arraytmp[0][2] = array("NOME"=>'test array 3',"TIPO"=>'9');

$arraytmp[1][0] = array("NOME"=>'test array 4',"TIPO"=>'3');
$arraytmp[1][1] = array("NOME"=>'test array 5',"TIPO"=>'2');
$arraytmp[1][2] = array("NOME"=>'test array 6',"TIPO"=>'8');

$arraytmp[2][0] = array("NOME"=>'test array 7',"TIPO"=>'10');
$arraytmp[2][1] = array("NOME"=>'test array 7',"TIPO"=>'11');
$arraytmp[2][2] = array("NOME"=>'test array 9',"TIPO"=>'12');
 
si, nel mio caso infatti $n_camere è un valore numerico postato, ho messo 2 solo per non far confondere chi legge il codice.

Ma secondo te credi che se aumentano il numero di elementi nell'array mi conviene prendere un server dedicato oppure dovrebbe funzionare?
 
ciao
... se aumentano il numero di elementi nell'array mi conviene prendere un server dedicato...
penso di no, almeno in una prima fase, poi dipende dal numero degli array, eventualmente se il tempo per il calcolo delle combinazioni diventa eccessivo e quindi prima che questo finisca termini il "tempo di vita dello script" sarà da aumentarne (phpini) il valore
 
potrei impostare set_time_limit a 0 e poi metto un loading in ajax, così l'utente non si accorge di nulla :-)

grazie di tutto borgo italia!
 
calcola che nell'esempio che ho postato sono solo degli esempi, posso avere 3 gruppi ma posso avere anche 7 gruppi, devo rendere il mio script dinamico e che funzioni in ogni evenienza.
 
ciao
per fare una prova con 7 o piu gruppi metti
PHP:
<?php
//$n_camere=2;
$iniziale=microtime();//all'inizio dello script
//ecc.......ecc...ecc..

$finale=microtime();//allafine dello script
$durata=($finale-$iniziale)/1000;
echo "<br> il tempo di di esecuzione dello scripit è di ".$durata." secondi";
?>
e poi non ti resta altro che fare delle prove
 

Discussioni simili