tonton Posted May 25, 2015 Share Posted May 25, 2015 Hi, goodnight, I have a json data which contains some items (it may have one or more items (with one or two taxes) and one shipping costs (with one or two taxes) : { "currency": "CAD", "email": "[email protected]", "items": [ { "name_title": "pen", "quantity": 1, "price": "20.00", "taxs": [ { "price": "3.00", "rates": 0.15, "name_title": "TaxOne" }, { "price": "1.38", "rates": 0.05, "name_title": "TaxSecond" } ] } ], "shipping_cost": [ { "code": "FDX", "price": "6.23", "name_title": "Fidex", "taxs": [ { "price": "1.55", "rates": 0.25, "name_title": "TaxOne" }, { "price": "2.37", "rates": 0.38, "name_title": "TaxSecond" } ] } ], "billing": { "names": "John Toto" }, "billing": { "names": "John Toto" }, "customers": { "invoce": null, "default_address": { "names": "John Toto" } } } With these data, I need the following information: Find the total price (Item price x quantity + its taxes + shipping costs + shipping taxes) = 20.00 x 1 + 3.0 + 1.00 + 6.23 + 1.55 + 2.37 = 34.15 find information articles and shipping information and its taxs like this : name --> pen, quantity --> 1 price --> 20.00 name --> Fidex quantity --> 1 (for this, it is always : 1!) price --> 6.23 name --> TaxOne quantity --> 1 (for this, it is always : 1!) price --> 4.55 name --> TaxSecond quantity --> 1 (for this, it is always : 1!) price --> 3.37 How can I change my array as seen above? In fact, I must build a new array with all this information above. like this : I transform my json data in array I delete the information on "Billing"; "delivery" and "client" Join taxes --> Items taxes + shipping tax I find tax items like this: $taxs_items = $new_array['items']['0']['taxs']; I wonder if this is good way, because of this ['0'] ? If zero change by another number ? Same for the shipping charges: $taxs_billing = $new_array['shipping_cost']['0']['taxs']; Then I merged the two array here this is my tax array: array(2) { ["TaxOne"]=> array(3) { ["price"]=> float(4.55) ["rates"]=> float(0.15) ["name_title"]=> string(6) "TaxOne" } ["TaxSecond"]=> array(3) { ["price"]=> float(3.75) ["rates"]=> float(0.05) ["name_title"]=> string(9) "TaxSecond" } } I also make another array for delivery without taxes In this array, I have to remove the tax, but how? I do like that, but it is not good as the others since there is a['0'].... unset($billing_without_tax['0']['taxs']); So now I will add items in this array Here's what I get: array(4) { [0]=> array(3) { ["name_title"]=> string(3) "pen" ["quantity"]=> int(1) ["price"]=> string(5) "20.00" } [1]=> array(3) { ["code"]=> string(3) "FDX" ["price"]=> string(4) "6.23" ["name_title"]=> string(5) "Fidex" } ["TaxOne"]=> array(3) { ["price"]=> float(4.55) ["rates"]=> float(0.15) ["name_title"]=> string(6) "TaxOne" } ["TaxSecond"]=> array(3) { ["price"]=> float(3.75) ["rates"]=> float(0.05) ["name_title"]=> string(9) "TaxSecond" } } So now, I'll do my calculation to find the total amount with taxes: and I find the right value: 34.53 When there is only one tax for an item, the code works too: For exemple, I romeve the following tax : "price": "1.38", rates:0.05, "name": "TaxSecond" I find the right value: 33.15 (34.53 - 1.38) The code is capable of calculating the amount according whit quantity: if there are two examples of an article, it find the right value. By cons, if there are two or three different items it does not add its tax. for exemple : { "currency": "CAD", "email": "[email protected]", "items": [ { "name_title": "pen", "quantity": 2, "price": "20.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "pensil", "quantity": 3, "price": "10.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "notebook", "quantity": 2, "price": "5.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" }, { "price": "1.38", "rates": 0.05, "name_title": "TaxSecond" } ] } ], "shipping_cost": [ { "code": "FDX", "price": "6.23", "name_title": "Fidex", "taxs": [ { "price": "1.55", "rates": 0.25, "name_title": "TaxOne" }, { "price": "2.37", "rates": 0.38, "name_title": "TaxSecond" } ] } ], "billing": { "names": "John Toto" }, "billing": { "names": "John Toto" }, "customers": { "invoce": null, "default_address": { "names": "John Toto" } } Here the calculated transaction : pen => 2 x 20.00 + 1.00 = 41.00 pensil => 3 x 10.00 + 1.00 = 31.00 "notebook" => 2 x 5.00 + 1.00 + 1.38 = 12.38 shipping => 6.23 + 1.55 + 2.37 = 10.15 sum => 41 + 31 + 12.38 + 10.15 = 94.53 by cons, my codes find this : 91.15 therefore missing : tax of items : 1 + 1 + 1 + 1,38 Here are my codes $json = ' { "currency": "CAD", "email": "[email protected]", "items": [ { "name_title": "pen", "quantity": 2, "price": "20.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "pensil", "quantity": 3, "price": "10.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "notebook", "quantity": 2, "price": "5.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" }, { "price": "1.38", "rates": 0.05, "name_title": "TaxSecond" } ] } ], "shipping_cost": [ { "code": "FDX", "price": "6.23", "name_title": "Fidex", "taxs": [ { "price": "1.55", "rates": 0.25, "name_title": "TaxOne" }, { "price": "2.37", "rates": 0.38, "name_title": "TaxSecond" } ] } ], "billing": { "names": "John Toto" }, "billing": { "names": "John Toto" }, "customers": { "invoce": null, "default_address": { "names": "John Toto" } } }'; // transforming my data in json table**** ****** ******** ***** $new_array = json_decode($json, true);; /* //print_r($new_array); var_dump($new_array); exit(); */ // delete those information "billing" ; "billing" and "customers" **** ****** ******** ***** unset($new_array['billing']); unset($new_array['billing']); unset($new_array['customers']); /* var_dump($new_array); exit(); */ //Consolidate taxs --> items of tax + billing tax **** ****** ******** ***** //find the taxs item $taxs_items = array(); $taxs_items = $new_array['items']['0']['taxs']; //Is not this good way, with ['0']? If zero exchange ? /* var_dump($taxs_items); exit(); */ //find the taxs of shipping $taxs_billing = array(); $taxs_billing = $new_array['shipping_cost']['0']['taxs']; //Is not this good way, with ['0']? If zero exchange ? /* var_dump($taxs_billing); exit(); */ // merge taxs array $taxs_items_billing = array_merge($taxs_items, $taxs_billing); /* var_dump($taxs_items_billing); exit(); */ //consolidate taxs sorting by name in a new array $taxs_items_billing_grouped = array(); foreach ($taxs_items_billing as &$allOfTax_value) { $tax_name = $allOfTax_value['name_title']; if (isset($taxs_items_billing_grouped[$tax_name])) { $taxs_items_billing_grouped[$tax_name]['price'] += $allOfTax_value['price']; } else { $taxs_items_billing_grouped[$tax_name] = $allOfTax_value; } } // Sort an array by key ksort($taxs_items_billing_grouped); /* var_dump($taxs_items_billing_grouped); exit(); */ //array of billing without taxs **** ****** ******** ***** $billing_without_tax = array(); $billing_without_tax = $new_array['shipping_cost']; // remove taxs unset($billing_without_tax['0']['taxs']); ////Is not this good way, with ['0']? If zero exchange ?!!!!!!!!!!!!!!! /* var_dump($billing_without_tax); exit(); */ // un nouveau table avec les items **** ****** ******** ***** $items_shipping_all_tx = array(); $items_shipping_all_tx = $new_array['items']; // remove taxs unset($items_shipping_all_tx['0']['taxs']); ////Is not this good way, with ['0']? If zero exchange ?!!!!!!!!!!!!!!! /* var_dump($items_shipping_all_tx); exit(); */ // add array of billing $items_shipping_all_tx = array_merge($items_shipping_all_tx, $billing_without_tax); /* var_dump($items_shipping_all_tx); exit(); */ // add array of taxs $items_shipping_all_tx = array_merge($items_shipping_all_tx, $taxs_items_billing_grouped); /* var_dump($items_shipping_all_tx); exit(); */ // find the total price with taxs **** ****** ******** ***** // here are my variable for calculations $price_without_tax_for_each_itmes = 0; $price_ht_all_items = 0; //I will use it later $total_taxs = 0; //I will use it later $total_sums = 0; foreach ($items_shipping_all_tx as &$all_value) { $total = $all_value['price']; //price without tax par item if (!isset($all_value['quantity'])) { $quantity = 1; // such as taxes (by cons I need this information later for my xml file } else { $quantity = $all_value['quantity']; // quantity per item } $price_without_tax_for_each_itmes = $total * $quantity; // price total hors tax par unite $total_sums += $price_without_tax_for_each_itmes; // amount : price without tax } $total_sums = number_format($total_sums, 2); echo $total_sums; exit(); So here are my questions: How can I change my codes to not use zeros like this : ['0'] ? why my codes forget items tax when there are several items ? How do I correct? have a nice night or day Thanks Link to comment https://forums.phpfreaks.com/topic/296476-calculate-the-best-values-found-in-an-array/ Share on other sites More sharing options...
QuickOldCar Posted May 25, 2015 Share Posted May 25, 2015 Your one example json is invalid { "currency": "CAD", "email": "[email protected]", "items": [ { "name_title": "pen", "quantity": 2, "price": "20.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "pensil", "quantity": 3, "price": "10.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "notebook", "quantity": 2, "price": "5.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" }, { "price": "1.38", "rates": 0.05, "name_title": "TaxSecond" } ] } ], "shipping_cost": [ { "code": "FDX", "price": "6.23", "name_title": "Fidex", "taxs": [ { "price": "1.55", "rates": 0.25, "name_title": "TaxOne" }, { "price": "2.37", "rates": 0.38, "name_title": "TaxSecond" } ] } ], "billing": { "names": "John Toto" }, "billing": { "names": "John Toto" }, "customers": { "invoce": null, "default_address": { "names": "John Toto" } } Parse error on line 77:...oto" } }---------------------^Expecting '}', ',', ']' You can check your json at jsonlint Link to comment https://forums.phpfreaks.com/topic/296476-calculate-the-best-values-found-in-an-array/#findComment-1512583 Share on other sites More sharing options...
tonton Posted May 25, 2015 Author Share Posted May 25, 2015 Hi QuickOldCar, Thanks, but I check always and I checked it : My json data is valid... Here is my json : { "currency": "CAD", "email": "[email protected]", "items": [ { "name_title": "pen", "quantity": 1, "price": "20.00", "taxs": [ { "price": "3.00", "rates": 0.15, "name_title": "TaxOne" }, { "price": "1.38", "rates": 0.05, "name_title": "TaxSecond" } ] } ], "shipping_cost": [ { "code": "FDX", "price": "6.23", "name_title": "Fidex", "taxs": [ { "price": "1.55", "rates": 0.25, "name_title": "TaxOne" }, { "price": "2.37", "rates": 0.38, "name_title": "TaxSecond" } ] } ], "billing": { "names": "John Toto" }, "billing": { "names": "John Toto" }, "customers": { "invoce": null, "default_address": { "names": "John Toto" } } } But I think, you did not copy all of my json data in my code : in part of my exemple, you are right last accolade " }" was lost But in my code, There are 3 accolade " }" at end of my data. Here is my code : $json = ' { "currency": "CAD", "email": "[email protected]", "items": [ { "name_title": "pen", "quantity": 2, "price": "20.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "pensil", "quantity": 3, "price": "10.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" } ] }, { "name_title": "notebook", "quantity": 2, "price": "5.00", "taxs": [ { "price": "1.00", "rates": 0.15, "name_title": "TaxOne" }, { "price": "1.38", "rates": 0.05, "name_title": "TaxSecond" } ] } ], "shipping_cost": [ { "code": "FDX", "price": "6.23", "name_title": "Fidex", "taxs": [ { "price": "1.55", "rates": 0.25, "name_title": "TaxOne" }, { "price": "2.37", "rates": 0.38, "name_title": "TaxSecond" } ] } ], "billing": { "names": "John Toto" }, "billing": { "names": "John Toto" }, "customers": { "invoce": null, "default_address": { "names": "John Toto" } } }'; // transforming my data in json table**** ****** ******** ***** $new_array = json_decode($json, true);; /* //print_r($new_array); var_dump($new_array); exit(); */ // delete those information "billing" ; "billing" and "customers" **** ****** ******** ***** unset($new_array['billing']); unset($new_array['billing']); unset($new_array['customers']); /* var_dump($new_array); exit(); */ //Consolidate taxs --> items of tax + billing tax **** ****** ******** ***** //find the taxs item $taxs_items = array(); $taxs_items = $new_array['items']['0']['taxs']; //Is not this good way, with ['0']? If zero exchange ? /* var_dump($taxs_items); exit(); */ //find the taxs of shipping $taxs_billing = array(); $taxs_billing = $new_array['shipping_cost']['0']['taxs']; //Is not this good way, with ['0']? If zero exchange ? /* var_dump($taxs_billing); exit(); */ // merge taxs array $taxs_items_billing = array_merge($taxs_items, $taxs_billing); /* var_dump($taxs_items_billing); exit(); */ //consolidate taxs sorting by name in a new array $taxs_items_billing_grouped = array(); foreach ($taxs_items_billing as &$allOfTax_value) { $tax_name = $allOfTax_value['name_title']; if (isset($taxs_items_billing_grouped[$tax_name])) { $taxs_items_billing_grouped[$tax_name]['price'] += $allOfTax_value['price']; } else { $taxs_items_billing_grouped[$tax_name] = $allOfTax_value; } } // Sort an array by key ksort($taxs_items_billing_grouped); /* var_dump($taxs_items_billing_grouped); exit(); */ //array of billing without taxs **** ****** ******** ***** $billing_without_tax = array(); $billing_without_tax = $new_array['shipping_cost']; // remove taxs unset($billing_without_tax['0']['taxs']); ////Is not this good way, with ['0']? If zero exchange ?!!!!!!!!!!!!!!! /* var_dump($billing_without_tax); exit(); */ // un nouveau table avec les items **** ****** ******** ***** $items_shipping_all_tx = array(); $items_shipping_all_tx = $new_array['items']; // remove taxs unset($items_shipping_all_tx['0']['taxs']); ////Is not this good way, with ['0']? If zero exchange ?!!!!!!!!!!!!!!! /* var_dump($items_shipping_all_tx); exit(); */ // add array of billing $items_shipping_all_tx = array_merge($items_shipping_all_tx, $billing_without_tax); /* var_dump($items_shipping_all_tx); exit(); */ // add array of taxs $items_shipping_all_tx = array_merge($items_shipping_all_tx, $taxs_items_billing_grouped); /* var_dump($items_shipping_all_tx); exit(); */ // find the total price with taxs **** ****** ******** ***** // here are my variable for calculations $price_without_tax_for_each_itmes = 0; $price_ht_all_items = 0; //I will use it later $total_taxs = 0; //I will use it later $total_sums = 0; foreach ($items_shipping_all_tx as &$all_value) { $total = $all_value['price']; //price without tax par item if (!isset($all_value['quantity'])) { $quantity = 1; // such as taxes (by cons I need this information later for my xml file } else { $quantity = $all_value['quantity']; // quantity per item } $price_without_tax_for_each_itmes = $total * $quantity; // price total hors tax par unite $total_sums += $price_without_tax_for_each_itmes; // amount : price without tax } $total_sums = number_format($total_sums, 2); echo $total_sums; exit(); How can I change my codes to not use zeros like this : ['0'] ? why my codes forget items tax when there are several items ? How do I correct? Thanks Link to comment https://forums.phpfreaks.com/topic/296476-calculate-the-best-values-found-in-an-array/#findComment-1512597 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.