PDA

View Full Version : [PHP] Somma di alcuni valori in un array


x3d0
17-07-2009, 21:32
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.

malocchio
20-07-2009, 10:13
Allora vediamo se il topic è da riesumare...

Cosa intendi di preciso con "array multidimensionale"?

Hai una cosa di questo tipo?$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$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$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 ),
);

x3d0
31-08-2009, 12:56
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

malocchio
02-09-2009, 03:05
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 :confused:

x3d0
13-12-2009, 22:04
Allora vediamo se il topic è da riesumare...

Cosa intendi di preciso con "array multidimensionale"?

Hai una cosa di questo tipo?$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$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$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

malocchio
14-12-2009, 00:57
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 :p

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

Nota quel
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
$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 foreach ( $arr as $recordA )

Ok :D ?

x3d0
14-12-2009, 19:47
Ciao,
ho creato una nuovo file .php con solamente questo 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)
);

$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
14-12-2009, 19:56
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
14-12-2009, 20:28
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ù.

malocchio
19-12-2009, 02:16
Sembrerebbe un problema di reference.

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

Prova con
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
/*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(1, 2, 3, 4);
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(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}

?>