Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea
L'euro digitale è una valuta fiat che entrerà in vigore nei prossimi anni. L'obiettivo principale è quello di ridurre la dipendenza dalle piattaforme di pagamento digitali statunitensi e offrire ai cittadini un modo semplice per trasferire denaro. Anche offline, anche in maniera (pseudo)anonima
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-07-2009, 20:32   #1
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
[PHP] Somma di alcuni valori in un array

Ho un array formato in questo modo

ID ROOM, ID TRATTAMENTO, PREZZO

852, 1, 400
852, 1, 250

852, 2, 300
852, 2, 500

852, 3, 500
852, 3, 600

853, 1, 500
853, 1, 600

Quello che devo fare io + sommare il valore PREZZO per array che hanno uguale ID ROOM e ID TRATTAMENTO.
Il tutto sta all'interno dello stesso array multidimensionale.
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 20-07-2009, 09:13   #2
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Allora vediamo se il topic è da riesumare...

Cosa intendi di preciso con "array multidimensionale"?

Hai una cosa di questo tipo?
Codice PHP:
$arr = array(
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 400),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 250),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 300),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 500),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 3'PREZZO' => 500),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 3'PREZZO' => 600),
    array(
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 500),
    array(
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 600)
); 
Se è così, basta un
Codice PHP:
$somme = array();
$flag_trovato false;

foreach ( 
$arr as $recordA ) {
    foreach ( 
$somme as $recordSomme ) {
        if ( 
$recordA['ID ROOM'] === $recordSomme['ID ROOM'] && $recordA['ID TRATTAMENTO'] === $recordSomme['ID TRATTAMENTO'] ) {
            
$recordSomme['PREZZO'] += $recordA['PREZZO'];
            
$flag_trovato true;
            break;
        }
    }
    if ( !
$flag_trovato ) {
        
$sommme[] = $recordA;
    }
    
$flag_trovato false;

che produce
Codice PHP:
$somme = array(
    array( 
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 650 ),
    array( 
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 800 ),
    array( 
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 1100 ),
); 
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 31-08-2009, 11:56   #3
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
In un altro forum mi hanno consigliato


<?php

$data[] = array('id_room' => 852, 'id_treatment' => 1, 'price' => 400);
$data[] = array('id_room' => 852, 'id_treatment' => 1, 'price' => 250);
$data[] = array('id_room' => 852, 'id_treatment' => 2, 'price' => 300);
$data[] = array('id_room' => 852, 'id_treatment' => 2, 'price' => 500);
$data[] = array('id_room' => 852, 'id_treatment' => 3, 'price' => 500);
$data[] = array('id_room' => 852, 'id_treatment' => 3, 'price' => 600);
$data[] = array('id_room' => 853, 'id_treatment' => 1, 'price' => 500);
$data[] = array('id_room' => 853, 'id_treatment' => 1, 'price' => 600);

foreach ($data as $item) {
$totali[$item['id_room']][$item['id_treatment']] += $item['price'];
}
print_r($totali);
?>


array(9) {
[0]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "1" ["price"]=> int(420) }
[1]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "2" ["price"]=> int(560) }
[2]=> array(3) { ["room"]=> string(3) "843" ["treatment_type"]=> string(1) "2" ["price"]=> int(630) }
[3]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "1" ["price"]=> int(70) }
[4]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "2" ["price"]=> int(90) }
[5]=> array(3) { ["room"]=> string(3) "843" ["treatment_type"]=> string(1) "2" ["price"]=> int(100) }
[6]=> array(3) { ["room"]=> string(3) "843" ["treatment_type"]=> string(1) "2" ["price"]=> int(100) }
[7]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "1" ["price"]=> int(70) }
[8]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "2" ["price"]=> int(90) }
}

e mi stampa

Array (
[842] =>
Array ( [1] => 560
[2] => 740 )

[843] => Array (
[2] => 830 )
)

ed è giusto
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 02-09-2009, 02:05   #4
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da x3d0 Guarda i messaggi
In un altro forum mi hanno consigliato


<?php

$data[] = array('id_room' => 852, 'id_treatment' => 1, 'price' => 400);
$data[] = array('id_room' => 852, 'id_treatment' => 1, 'price' => 250);
$data[] = array('id_room' => 852, 'id_treatment' => 2, 'price' => 300);
$data[] = array('id_room' => 852, 'id_treatment' => 2, 'price' => 500);
$data[] = array('id_room' => 852, 'id_treatment' => 3, 'price' => 500);
$data[] = array('id_room' => 852, 'id_treatment' => 3, 'price' => 600);
$data[] = array('id_room' => 853, 'id_treatment' => 1, 'price' => 500);
$data[] = array('id_room' => 853, 'id_treatment' => 1, 'price' => 600);

foreach ($data as $item) {
$totali[$item['id_room']][$item['id_treatment']] += $item['price'];
}
print_r($totali);
?>


array(9) {
[0]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "1" ["price"]=> int(420) }
[1]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "2" ["price"]=> int(560) }
[2]=> array(3) { ["room"]=> string(3) "843" ["treatment_type"]=> string(1) "2" ["price"]=> int(630) }
[3]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "1" ["price"]=> int(70) }
[4]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "2" ["price"]=> int(90) }
[5]=> array(3) { ["room"]=> string(3) "843" ["treatment_type"]=> string(1) "2" ["price"]=> int(100) }
[6]=> array(3) { ["room"]=> string(3) "843" ["treatment_type"]=> string(1) "2" ["price"]=> int(100) }
[7]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "1" ["price"]=> int(70) }
[8]=> array(3) { ["room"]=> string(3) "842" ["treatment_type"]=> string(1) "2" ["price"]=> int(90) }
}

e mi stampa

Array (
[842] =>
Array ( [1] => 560
[2] => 740 )

[843] => Array (
[2] => 830 )
)

ed è giusto
Non capisco
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2009, 21:04   #5
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Quote:
Originariamente inviato da malocchio Guarda i messaggi
Allora vediamo se il topic è da riesumare...

Cosa intendi di preciso con "array multidimensionale"?

Hai una cosa di questo tipo?
Codice PHP:
$arr = array(
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 400),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 250),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 300),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 500),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 3'PREZZO' => 500),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 3'PREZZO' => 600),
    array(
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 500),
    array(
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 600)
); 
Se è così, basta un
Codice PHP:
$somme = array();
$flag_trovato false;

foreach ( 
$arr as $recordA ) {
    foreach ( 
$somme as $recordSomme ) {
        if ( 
$recordA['ID ROOM'] === $recordSomme['ID ROOM'] && $recordA['ID TRATTAMENTO'] === $recordSomme['ID TRATTAMENTO'] ) {
            
$recordSomme['PREZZO'] += $recordA['PREZZO'];
            
$flag_trovato true;
            break;
        }
    }
    if ( !
$flag_trovato ) {
        
$sommme[] = $recordA;
    }
    
$flag_trovato false;

che produce
Codice PHP:
$somme = array(
    array( 
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 650 ),
    array( 
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 800 ),
    array( 
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 1100 ),
); 
scusa, ma all'inizio all'array somme che valori gli devo dare?
Così com'è lo script non esegue il secondo foreach in quanto somme = array(); ovvero un array vuoto
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2009, 23:57   #6
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Quote:
Originariamente inviato da x3d0 Guarda i messaggi
scusa, ma all'inizio all'array somme che valori gli devo dare?
Così com'è lo script non esegue il secondo foreach in quanto somme = array(); ovvero un array vuoto
Febbraio 09

Allora ho riletto e il codice che scrissi a suo tempo mi sembra corretto:

Nota quel
Codice PHP:
if ( !$flag_trovato ) {
        
$sommme[] = $recordA;
    } 
che sta all'interno del foreach sull'array dei dati (non le somme).
Alla prima iterazione del suddetto ciclo, l'array somme è, come hai detto tu, vuoto ($somme = array() ), e quindi la variabile $flag_trovato sarà false e l'if si attiverà. Significa che non esiste, nell'array somme, un record relativo alla coppia [room,trattamento] e quindi deve essere aggiunto.
Dopo la prima iterazione l'array conterrà sicuramente un record. Ad esempio
Codice PHP:
$somme = array(1) {
[
0]=> array(3) { ["room"]=> string(3"842" ["treatment_type"]=> string(1"1" ["price"]=> int(420) }

A quel punto $somme non è più array vuoto e si entrerà nel foreach annidato, alla prossima iterazione di
Codice PHP:
foreach ( $arr as $recordA 
Ok ?
__________________
malocchio è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2009, 18:47   #7
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Ciao,
ho creato una nuovo file .php con solamente questo codice

Codice PHP:
<?php

$arr 
= array(
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 400),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 1'PREZZO' => 250),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 300),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 2'PREZZO' => 500),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 3'PREZZO' => 500),
    array(
'ID ROOM' => 852'ID TRATTAMENTO' => 3'PREZZO' => 600),
    array(
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 500),
    array(
'ID ROOM' => 853'ID TRATTAMENTO' => 1'PREZZO' => 600)
);

$somme = array();
$flag_trovato false;

foreach ( 
$arr as $recordA ) {
    foreach ( 
$somme as $recordSomme ) {
        if ( 
$recordA['ID ROOM'] === $recordSomme['ID ROOM'] && $recordA['ID TRATTAMENTO'] === $recordSomme['ID TRATTAMENTO'] ) {
            
$recordSomme['PREZZO'] += $recordA['PREZZO'];
            
$flag_trovato true;
            break;
        }
    }
    if ( !
$flag_trovato ) {
        
$sommme[] = $recordA;
    }
    
$flag_trovato false;
}


echo 
"<pre>"print_r($somme); echo "</pre>";


?>
e mi stampa

Array
(
)


controlla tu stesso.
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2009, 18:56   #8
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
EDIT

Funziona!

In pratica qui

if ( !$flag_trovato ) {
$sommme[] = $recordA;
}

scrivi $sommme con 3 m anzichè somme! Vabbè risolto.

Ti ringrazio per l'aiuto!
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2009, 19:28   #9
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
UPDATE

A prima vista funzionava ma non fa la somma del prezzo. mi lascia solamente il primo prezzo. controlla tu stesso.
Credo che il problema sia qui

$recordSomme['PREZZO'] += $recordA['PREZZO'];

ovvero $recordSomme['PREZZO'] una volta che è stato aggiunto il prezzo non lo uso più.
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2009, 01:16   #10
malocchio
Senior Member
 
L'Avatar di malocchio
 
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
Sembrerebbe un problema di reference.

Il foreach opera su una copia dell'elemento dell'array.

Prova con
Codice PHP:
foreach ( $somme as &$recordSomme ) { 
        if ( 
$recordA['ID ROOM'] == $recordSomme['ID ROOM'] && $recordA['ID TRATTAMENTO'] == $recordSomme['ID TRATTAMENTO'] ) { 
(ho aggiunto l'ampersend davanti alla variabile iterata)

EDIT: se ti interessa, ti incollo la parte della documentazione che esplica questo lato oscuro del Php
Codice PHP:
/*Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it. 

As of PHP 5, you can easily modify array's elements by preceding $value with &. This will assign reference instead of copying the value. */
<?php
$arr 
= array(1234);
foreach (
$arr as &$value) {
    
$value $value 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?> 

//This is possible only if iterated array can be referenced (i.e. is variable), that means the following code won't work: 
<?php
foreach (array(1234) as &$value) {
    
$value $value 2;
}

?>
__________________

Ultima modifica di malocchio : 19-12-2009 alle 11:32.
malocchio è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea Oltre il contante e le crypto: tutto sull'Euro D...
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
Vent'anni di autopsie in un clic: nasce ...
Euro digitale, la BCE accelera: 36 partn...
Cowork, ChatGPT Work e ora Sand: Cursor ...
WhatsApp testa un cloud tutto suo per i ...
Un tassello dell'origine della vita scop...
Galaxy S26 Ultra, macchie rosse sul disp...
HUAWEI FreeClip 2S: miglior qualit&agrav...
Bun, IA ovunque e riscrittura in Rust: i...
Una startup cinese va oltre i nanometri,...
CORSAIR Platform:4 e Platform:4 Elevate,...
UnipolMove diventa più caro: scat...
Il CEO di Palantir: l'intelligenza artif...
CXMT come un treno: quasi raggiunta la c...
Il CEO di Microsoft invita le imprese al...
Agent 64: Spies Never Die arriverà...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v