JSON file editing

First of all, yes, I checked other options, questions and answers, but, unfortunately, this did not work for me.

So, I am currently working on a small project, including a shopping cart system. The shopping cart system is created by a PHP session and everything works fine. Products can be added, rows can be removed, and the cart can be completely cleaned.

Now I would like to add some functions, such as counting items in the basket, calculating the total price and VAT prices. Since the session is stored as a JSON object, I can use angularjsboth $http.get()to read the cart object JSONand override the data so that it can be used in ng-repeatfor presentation.

So, when the visitor clicks the add to cart button, the following code creates a session:

session_start();

$product_id = $_REQUEST['product_id'];
$product_name = $_REQUEST['product_name'];
$product_price = round($_REQUEST['product_price'], 2);
$product_size = $_REQUEST['product_size'];
$product_quantity = $_REQUEST['product_quantity'];
$total_product_price = $product_price*$product_quantity;
round($total_product_price, 2);
// Add new item to session
$cartProduct = array(
    "id" => $product_id,
    "name" => $product_name,
    "price" => $product_price,
    "size" => $product_size,
    "quantity" => $product_quantity,
    "total_product_price" => $total_product_price,
    "total_items" => 0
);

/*
 * check if the 'cart' session array was created
 * if it is NOT, create the 'cart' session array
 */
if(empty($_SESSION['cart']["cartItems"])){
    $_SESSION['cart']["cartItems"] = array();
}

// check if the item is in the array, if it is, do not add
if(array_key_exists($product_id and $product_size, $_SESSION['cart'])){
    // redirect to product list and tell the user it was added to cart
    echo "<script> alert('Dit product staat al in de winkelwagen')</script>])";
}

// else, add the item to the array
else{
    $_SESSION['cart']["cartItems"][$product_id]=$cartProduct;
}

So, my first attempt was to add to the section "add an element to an array"

    $arr = json_decode($_SESSION['cart']['cartItems'][$product_id], true);
    $total_items['total_items'] = count($_SESSION['cart']);
    array_push($arr['cartItems'], $total_items);

But unfortunately, this did not work. I also tried adding this to the getCart section.

session_start();

$json = json_encode($_SESSION['cart']["cartItems"]);
echo($json);

Unfortunately, without any results.

So my question is how can I add the calculation of total_items to the array. And how can I calculate the total price, VAT prices, etc.?

PS: single product JSON result:

{"16":{"id":"16","name":"TestDatumProduct","price":1000,"size":"M","quantity":"4","total_product_price":4000,"total_items":0}}

UPDATE

So, an update to combine the progress of the last few days:

So now my code is based on @ devionNL's answer, since I like the action method, and @ FranciscoRodríguez's answer was hardly the answer as it only advised me on the counting method (didn't work)

, @devionNL, .

<?php
session_start();
$cartItemID = $_REQUEST['cartItem_id'];
$product_id = $_REQUEST['product_id'];
$product_name = $_REQUEST['product_name'];
$product_price = round($_REQUEST['product_price'], 2);
$product_size = $_REQUEST['product_size'];
$product_quantity = $_REQUEST['product_quantity'];
$total_product_price = $product_price*$product_quantity;
round($total_product_price, 2);

// Add new item to session
$cartProduct = array(
    "id" => $product_id,
    "name" => $product_name,
    "price" => $product_price,
    "size" => $product_size,
    "quantity" => $product_quantity,
    "total_product_price" => $total_product_price
);

// If the session is empty create an empty array
if(empty($_SESSION['cart']["cartItems"])){
    $_SESSION['cart']["cartItems"] = array();
}

// Add to cart
if ($_REQUEST['action'] == 'addToCart')
{
    if (array_key_exists($product_id, $_SESSION['cart']['cartItems']))
    {
        $_SESSION['cart']['cartItems']['totalItems']++;
    }
    else
    {
        $_SESSION['cart']['cartItems']['totalItems']++;
        array_push($_SESSION['cart']['cartItems'], $cartProduct );
    }
}

// RemoveRow
else if ($_REQUEST['action'] == 'removeRow') // If you want a delete action
{
    if (array_key_exists($product_id, $_SESSION['cart']['cartItems']))
    {
        if ($_SESSION['cart']['cartItems']['totalItems'] > 1)
        {
            foreach ($cartDecode as $key => $cartItem)
            {
                // IF THE TITLE MATCHES THE SIGNAL STRING
                if ($cartItem->{"id"} == $cartItemID)
                {
                    // REMOVE THIS OBJECT
                    unset($cartDecode[$key]);
                }

            }
            $_SESSION['cart']['cartItems']['totalItems']--; // Deduct by 1.
        }
    else
        {
            $_SESSION['cart']['cartItems'] = $cartProduct;
        }
    }

    $_SESSION['cart']['cartItems']['totalPrice'] = array_sum(array_map(function($item) {
        return $item['price'] * $item['totalItems'];
    },
        $_SESSION['cart']['cartItems']));

}
$cart = json_encode($_SESSION['cart']['cartItems']);
echo ($cart);

, , cartItems , . . . cart. JSON :

{"totalItems":2,"0":{"id":"7","name":"Bedrukt jurkje van chiffon","price":20.5,"size":"M","quantity":"3","total_product_price":61.5},"1":{"id":"5","name":"Bedrukte Zomerjurk","price":30.5,"size":"M","quantity":"3","total_product_price":91.5}}

JSON :

{"cartItems":{"totalItems":2,"0":{"id":"7","name":"Bedrukt jurkje van chiffon","price":20.5,"size":"M","quantity":"3","total_product_price":61.5},"1":{"id":"5","name":"Bedrukte Zomerjurk","price":30.5,"size":"M","quantity":"3","total_product_price":91.5}}}

, ? 1. (ID == "", Then delete) 2. ? 3. dabatase, ? (id, ..). , foreach()?

- , .

, !

+4
4

, , , (: " " ).

, Add/Remove, productId , , , , "" .

, $product_id .

session_start();

// If the cart or cartItems isn't set, create empty
if (empty($_SESSION['cart']) || empty($_SESSION['cart']['cartItems']))
{
   $_SESSION['cart'] = array();
   $_SESSION['cart']['cartItems'] = array();
   $_SESSION['cart']['totalPrice'] = 0;
   $_SESSION['cart']['totalItems'] = 0;
}

// Search the cartItems for the column named productId that matches the $product_id. This can return null, so always verify with !empty.

$arrayKeyId = array_search($product_id, array_column($_SESSION['cart']['cartItems'], 'productId'));

if ($_REQUEST['action'] == 'add')
{
  if (!empty($arrayKeyId)) // If it isn't empty, append to  the quantity
     $_SESSION['cart']['cartItems'][$arrayKeyId]['totalItems']++;
  else // It new: Add it to the array
     $_SESSION['cart']['cartItems'][] = $cartProduct;
}
else if ($_REQUEST['action'] == 'delete') // If you want a delete action
{
  if (!empty($arrayKeyId))
  {
   // If more than 1 quantity, lower by 1 
   if ($_SESSION['cart']['cartItems'][$arrayKeyId]['totalItems'] > 1)
       $_SESSION['cart']['cartItems'][$arrayKeyId]['totalItems']--;
   else // Or if there was only 1, remove the item fully. 
      unset($_SESSION['cart']['cartItems'][$arrayKeyId]);
  }
}

// Total price based on item count times their price.
$_SESSION['cart']['totalPrice'] = array_sum(array_map(function($item) { 
    return $item['price'] * $item['totalItems']; 
}, $_SESSION['cart']['cartItems']));

// Total items based on the total amount of cartItems (without their quantity)
$_SESSION['cart']['totalItems'] = count($_SESSION['cart']['cartItems']);


echo json_encode($_SESSION['cart']['cartItems']);
+1

, :

$arr = json_decode($_SESSION['cart']['cartItems'][$product_id], true);
$total_items['total_items'] = count($_SESSION['cart']);
array_push($arr['cartItems'], $total_items);

$arr json 1 . , ( ), 'total_items'. , json, 'cartItems' ( )

, :

$_SESSION['cart']['cartSize'] = count($_SESSION['cart']['cartItems']);
+2

, , , , :

<?php
session_start();
//unset($_SESSION['cart']);
var_dump($_SESSION['cart']['cartItems']);
$cartItemID = $Req['cartItem_id'];
$product_id = $Req['product_id'];
$product_name = $Req['product_name'];
$product_price = round($Req['product_price'], 2);
$product_size = $Req['product_size'];
$product_quantity = $Req['product_quantity'];
$total_product_price = $product_price*$product_quantity;
round($total_product_price, 2);

// Add new item to session
$cartProduct = array(
    "id" => $product_id,
    "name" => $product_name,
    "price" => $product_price,
    "size" => $product_size,
    "quantity" => $product_quantity,
    "total_product_price" => $total_product_price
);

// If the session is empty create an empty array
if(empty($_SESSION['cart']["cartItems"])){
    $_SESSION['cart']["cartItems"] = array();
    $_SESSION['cart']["cartItems"]["totalitems"] = 0;
    $_SESSION['cart']["cartItems"]["totalprice"] = 0;

}

// Add to cart
if ($Req['action'] == 'addToCart') {
    if (!isset($_SESSION['cart']["cartItems"][$cartItemID])) {
        $_SESSION['cart']["cartItems"][$cartItemID] = $cartProduct;
        $_SESSION['cart']["totalitems"]++;
        $_SESSION['cart']["totalprice"] += $total_product_price;
    }
}

// RemoveRow
else if ($Req['action'] == 'removeRow') // If you want a delete action
{
    if (isset($_SESSION['cart']["cartItems"][$cartItemID])) {
        $_SESSION['cart']["totalitems"]--;
        $_SESSION['cart']["totalprice"] -= $_SESSION['cart']["cartItems"][$cartItemID];
        unset($_SESSION['cart']["cartItems"][$cartItemID]);
    }

}
$cart = json_encode($_SESSION['cart']['cartItems']);
echo ($cart);

, . "cartItemID" "cartProduct". "cart" . :

  • $_SESSION ['cart'] [ "totalprice" ] "

  • , $_SESSION ['cart'] [ "cartItems" ].

+1

, , . , , . , totalItems totalPrice $_SESSION ['cart'], $_SESSION ['cart'] [ "cartItems" ] elese, array_map, , . , .

session_start();
    $cartItemID = $_REQUEST['cartItem_id'];
    $product_id = intval($_REQUEST['product_id']); //if product_id is integer use intval
    $product_name = $_REQUEST['product_name'];
    $product_price = round(doubleval($_REQUEST['product_price']), 2);//if product_price is double use doubleval will help for the calculations
    $product_size = $_REQUEST['product_size'];
    $product_quantity = intval($_REQUEST['product_quantity']); //if product_quantity is integer use intval will help for the calculations
    $total_product_price = $product_price*$product_quantity; 
    round($total_product_price, 2);



    // Add new item to session
    $cartProduct = array(
        "id" => $product_id,
        "name" => $product_name,
        "price" => $product_price,
        "size" => $product_size,
        "quantity" => $product_quantity,
        "total_product_price" => $total_product_price
    );

    // If the session is empty create an empty array
    if(empty($_SESSION['cart']["cartItems"])){
        $_SESSION['cart']["cartItems"] = array();
    }

    // Add to cart
    if ($_REQUEST['action'] == 'addToCart')
    {
        if (array_key_exists($product_id, $_SESSION['cart']['cartItems']))
        {
            //$_SESSION['cart']['totalItems']++; //this line can cause problems when removing item out of the cart, when the user adds an item and you increment the total items value, you have to increment the value for the specific product in order to substract the correct number in the removal, 
            //you can use 2 approaches depending what you trying to achieve, 
            //1. if $_SESSION['cart']['totalItems'] is the items by type then you don't need to increment if item exists , just comment your line
            //2. if $_SESSION['cart']['totalItems'] represents the total number of items by adding the quantity of every product then this has to change use the following which i recommend
            $_SESSION['cart']['cartItems'][$product_id]['quantity']+=$product_quantity;
            $_SESSION['cart']['cartItems'][$product_id]['total_product_price']+=$total_product_price;
        }
        else
        {
            //$_SESSION['cart']['totalItems']++;
            //use this line for 2nd apporach
            $_SESSION['cart']['cartItems'][$product_id] = $cartProduct ; //array_push is wrong here you need a key that is the product id not the next available index, array_push will just give you the next available index, that why the rest not working

        }
        //use this line for 2nd apporach
        $_SESSION['cart']['totalItems']+=$product_quantity;
    }

    // RemoveRow
    else if ($_REQUEST['action'] == 'removeRow') // If you want a delete action
    {
        if (array_key_exists($product_id, $_SESSION['cart']['cartItems']))
        {
            if ($_SESSION['cart']['totalItems'] > 1)
            {
                /*foreach ($cartDecode as $key => $cartItem)
                {
                    // IF THE TITLE MATCHES THE SIGNAL STRING
                    if ($cartItem->{"id"} == $cartItemID)
                    {
                        // REMOVE THIS OBJECT
                        unset($cartDecode[$key]);
                    }

                }*///cannot understand what you are trying to achieve here, but seems not wokring

                //$_SESSION['cart']['totalItems']--; // Deduct by 1. //again use this if you want 1st approach

                //use the following if you want the 2nd approach which i recommend
                $_SESSION['cart']['totalItems']-=$_SESSION['cart']['cartItems'][$product_id]['quantity'];
                unset($_SESSION['cart']['cartItems'][$product_id]); //this lines is working
            }
            else
            {
                $_SESSION['cart']['cartItems'] = $cartProduct;//what this line do, it seems a bit strange, not to say wrong...
            }
        }
    }

    $_SESSION['cart']['totalPrice'] = array_sum(array_map(function($item) {
        return $item['price'] * $item['quantity']; //it quantity not totla_items
    }, //this calculation has to be outside of the else if ($_REQUEST['action'] == 'removeRow') in order to make the toal sum calculation in every pass
    $_SESSION['cart']['cartItems']));
    $cart = json_encode($_SESSION['cart']);
    echo ($cart);

, .

$_REQUEST['action'] = "addToCart";
//unset( $_SESSION['cart']);
/*$product_id = 7;
$product_name = "Bedrukt jurkje van chiffon";
$product_price = 20.5;
$product_size = "M";
$product_quantity = 1;
$total_product_price = 20.5;
*/
$product_id = 5;
$product_name = "Bedrukte Zomerjurk";
$product_price = 30.5;
$product_size = "M";
$product_quantity = 1;
$total_product_price = 30.5;

, script comment/un , $_REQUEST ['action'], Row, .

0

Source: https://habr.com/ru/post/1688862/


All Articles