Raggruppamento valori di un intervallo

  • Creatore Discussione Creatore Discussione JRCash
  • Data di inizio Data di inizio

JRCash

Nuovo Utente
12 Nov 2014
11
0
0
Ciao a tutti, sono nuovo, avrei un problema:
in un form inserisco dei dati: "codice" e "peso"; dopo devo estrarli da MySQL in modo che stiano entro un range....cioè...esempio:
01 1100
02 1097
03 1103
etc....

Adesso li voglio visualizzare raggruppati in modo che la differenza massima fra i pesi sia di 5.
Quindi se prendo 1100 e 1097 il 1103 non va bene perché la differenza max è 6.

Lavorerò con un numero indefinito di elementi.

Spero di essere stato chiaro, grazie a tutti
 
Mi spiego meglio:
Sto creando un magazzino in cui inserisco i valori di pale per eliche. Io poi le dovrò accoppiare in modo che la differenza massima di peso fra le pale sia di 5 grammi. Vorrei visualizzarle in gruppi in modo da avere, visivamente, un'idea degli accoppiamenti possibili.
Grazie
 
ciao
scusa ma non si capisce bene, faccio un esempio, tu hai esempio
01 1100
02 1097
03 1104
04 1105
05 1106
06 1112
ecc...

vuoi che impostando un peso, es. 1104, salti fuori solo
03 1104
04 1105
05 1106

o per raggruppamento in qualche modo suddivise,es.
1097, 1100
1104, 1105, 1106
1112
 
È giusta la seconda! In sostanza non ho un valore di riferimento. Devo fare in modo che i valori si confrontino con loro stessi.....
 
È giusta la seconda. Non ho un valore di riferimento, ma devo fare in modo che i valori si confrontano con loro stessi....mamma come è difficile spiegarlo!
 
Quindi i raggruppamenti devono avere una differenza massima di 5 tra il minimo e il massimo, esatto?
Ma i raggruppamenti esistono già e devi solo fare un controllo o li devi creare?
1) esistono già:
E' un semplice controllo tra il valore del minimo e del massimo.

2) devi crearli:
Parti dal primo che trovi e inserisci nel raggruppamento tutti i pesi che rientrano nel range e quando trovi uno che non è nel range (differenza massima di 5) allora crei un altro raggruppamento.
Se non sai quanti sono con php non c'è alcun problema perché non devi dichiarare prima la dimensione degli array.
 
Giusta la seconda, ma quando inserisco il 4 valore (per esempio) deve essere in tolleranza contemporanea con i primi 3, il quinto con i primi 4 e via così.
 
Non riesco a rispondere con TapaTalk!!! comunque il caso esatto è quello espresso al punto 2 di Long8....però io non ho un valore di riferimento, quindi devo dividere in gruppi in cui la DIFFERENZA MASSIMA è 5 grammi. es --> l'elemento 6 deve essere entro i 5 con gli elementi 1,2,3,4,5 poi, l'elemento 7 deve esserlo con 1,2,3,4,5,6 e così via....quando non si riesce ad aggiungere elementi al gruppo si passa al gruppo dopo con un intervallo diverso (range di sempre di 5, ma con valori diversi).
 
ciao
buttata giù così al volo quindi non so se funzia
PHP:
<?php
//...
$q="SELECT * from tabella ORDER BY peso";//estrai per ordine di peso
//...
$delta = 3; //differenza di peso
$conta=0; //un contaore per l'array
//leggi la tabella
while($riga=mysqli_fetch_array($ris)){
	$id=$riga['id'];
	$peso=$riga['peso'];
	if($conta==0){
		$suddivisione[$conta]=$riga['peso'];//è il primo item
	}else{
		if( $suddivisione[$conta-1] <= $peso- $delta){//l'item rientra appena letto nel tange
			$suddivisione[$conta-1] .=", ".$peso;//concateni
		}else{
			$conta++;//incrementi il contatore
			$suddivisione[$conta]=$peso;//crei un nuovo item dell'array
		}
	
	}
}
foreach($suddivisione as $val){
	echo "$val<br />";//mostri i raggruppamenti
}
//......
?>
come detto buttato giù quindi, se funziona va comunque affinato
 
Io pensavo di usare un campo tabella come flag a 0 fare un controllo ricorsiva in cui i valori se soddisfano -5 <P1-P2 || P1-P2 > 5 se ok: flag = 1. Poi passo a P2-P3 in cui controllo solo i flag a 0 e setto quelli ok a 2 e così via! Poi echo tutti i flag 1 poi i 2 e via così. ....credo possa funzionare! Ps: per me è più semplice così senza array perché in realtà ogni record ha 5 campi da gestire. Ggrazie
 
non sapendo su quanti elementi dovrai lavorare, io cercherei di fare i calcoli direttamente sul db,
anche usando una tabella temporanea, in pratica,
per ciascun elemento presente nella tabella codice,peso
calcolerei la differenza con gli altri elementi escludendo quelli superiori al peso di riferimento
quindi li metterei in una tabella con codice1, codice2, peso1, peso2, diffpeso
a questo punto listando la tabella ordinata per codice1, diffpeso, codice2
dovrei ottenere il risultato che ti serve

se posti un file con codice e peso potrei provare
ciao
Marino
 
PHP:
<?php 
$conn = new mysqli("localhost", "root", "", "database"); 
if ($conn->connect_error) {
  trigger_error('Database connection failed: '  . $conn->connect_error, E_USER_ERROR);
}

$ris = $conn->query("SELECT * from tabella ORDER BY peso");//estrai per ordine di peso 
$delta = 5; //differenza di peso 
$elemento = 0; //un contatore di elementi nel gruppo
$gruppo = 0; //numero del gruppo

while($riga=mysqli_fetch_array($ris)){ //leggi la tabella 
    $peso=$riga['peso']; 
    if($elemento==0){ //se è il primo elemento
        $suddivisione[$gruppo][$elemento]=$peso;//è il primo item 
    }else{
        if( ($peso >= max($suddivisione[$gruppo])-$delta) && ($peso <= min($suddivisione[$gruppo])+$delta) ){//se il peso rientra nel range 
            $suddivisione[$gruppo][$elemento] = $peso;//aggiungo il peso allo stesso gruppo
        }else{ //cambio gruppo
        	$gruppo++;
			$elemento=0;
			$suddivisione[$gruppo][$elemento] = $peso;
        } 
    } 
	$elemento++;//incremento il contatore 
} 
//STAMPA
foreach($suddivisione as $key => $val){
	echo "gruppo: $key<br>";
	foreach($val as $valore) {
    	echo "$valore<br>";
	}
} 
?>
L'ho testato e funziona.
 
Ultima modifica:

Discussioni simili