arunpatal Posted February 14, 2014 Share Posted February 14, 2014 Hi, Here am i again with new problem.... //remove one quantity from item if (isset ($_GET["remove"])) { $x = $_GET["remove"]; foreach($_SESSION["viks_cart_array"] as $index => $value) { if ($_SESSION["viks_cart_array"][$index]['item_id'] == $x) { $q = $_SESSION["viks_cart_array"][$index]['quantity']; $_SESSION["viks_cart_array"][$index]['quantity'] = $q - 1; header("location:" . $_SERVER["PHP_SELF"]); break; } } }; I want to remove index when quantity is zero $_GET["remove"] values gets a item_id Quote Link to comment Share on other sites More sharing options...
Psycho Posted February 14, 2014 Share Posted February 14, 2014 (edited) Well, I'm confused as to what you want since your code doesn't seem to have anything to do with the request. It would be helpful if you stated what is contained in the various variable. The array value $_SESSION["viks_cart_array"][$index] appears to be a sub-array with at least indexes of 'item_id' and 'quantity'. That a poor way of storing that information. It should be in this format: $_SESSION["viks_cart_array"][$item_id] = $quantity Then this becomes a VERY simple process. Creating the item_id and quantity as separate sub-keys is problematic. EDIT: Also the code is inefficient. There is a loop of the array that uses $index & $value - but then those aren't used within the loop as they should be and instead the full array path is listed. Edited February 14, 2014 by Psycho Quote Link to comment Share on other sites More sharing options...
arunpatal Posted February 14, 2014 Author Share Posted February 14, 2014 The array look like this Array ( [0] => Array ( [item_id] => 1 [quantity] => 0 ) [1] => Array ( [item_id] => 2 [quantity] => 1 ) ) Quote Link to comment Share on other sites More sharing options...
arunpatal Posted February 14, 2014 Author Share Posted February 14, 2014 (edited) The array look like this Array ( [0] => Array ( [item_id] => 1 [quantity] => 0 ) [1] => Array ( [item_id] => 2 [quantity] => 1 ) ) Each subarray contains item id and qty I tried this but no success if (isset ($_GET["remove"])) { $x = $_GET["remove"]; foreach($_SESSION["viks_cart_array"] as $index => $value) { if ($_SESSION["viks_cart_array"][$index]['item_id'] == $x) { if ($_SESSION["viks_cart_array"][$index]['quantity'] == 0) { unset ($_SESSION["viks_cart_array"][$index]); } else { $_SESSION["viks_cart_array"][$index]['quantity'] = $q - 1; } } } }; Edited February 14, 2014 by arunpatal Quote Link to comment Share on other sites More sharing options...
Psycho Posted February 14, 2014 Share Posted February 14, 2014 (edited) The array should look like this: Array ( [1] => 0 [2] => 1 ) Where the 1 & 2 as indexes are the item IDs and the 0 & 1 are the quantities. If you set up your array correctly the code to do what you want could look like this [Note: no need to iterate over every item in the array!]: //remove one quantity from item if (isset ($_GET["remove"])) { //Set the item ID to reduce $itemIdToRemove = intval($_GET["remove"]); if(isset($_SESSION["viks_cart_array"][$itemIdToRemove])) { //Reduce quantity by 1 $_SESSION["viks_cart_array"][$itemIdToRemove]--; //Remove ANY items from cart where quantity is 0 $_SESSION["viks_cart_array"] = array_filter($_SESSION["viks_cart_array"]); } header("location:{$_SERVER['PHP_SELF']}"); exit(); } Edited February 14, 2014 by Psycho Quote Link to comment Share on other sites More sharing options...
.josh Posted February 14, 2014 Share Posted February 14, 2014 I too am a bit unclear about what you really want vs. code you posted, so this is just a half guess, but perhaps this will work for you: $_SESSION["viks_cart_array"] = array_filter( $_SESSION["viks_cart_array"], function($elem) { return $elem['quantity']; } ); This will give for example: // before Array ( [viks_cart_array] => Array ( [0] => Array ( [quantity] => 1 ) [1] => Array ( [quantity] => 2 ) [2] => Array ( [quantity] => 0 ) [3] => Array ( [quantity] => 3 ) [4] => Array ( [quantity] => 0 ) ) ) // after Array ( [viks_cart_array] => Array ( [0] => Array ( [quantity] => 1 ) [1] => Array ( [quantity] => 2 ) [3] => Array ( [quantity] => 3 ) ) ) Quote Link to comment Share on other sites More sharing options...
Ch0cu3r Posted February 14, 2014 Share Posted February 14, 2014 (edited) Pyshco array structure is the way to go, as you can immediatly look up the items quantiy using its id as the key to $_SESSION["viks_cart_array"]. Rather then looping over each item one by one checking for items id matches. But working with your current array structure, this will remove the item from the array if the items quantity becomes 0 or less //remove one quantity from item if (isset ($_GET["remove"])) { $x = $_GET["remove"]; foreach($_SESSION["viks_cart_array"] as $index => &$item) { if ($item['item_id'] == $x) { // take 1 away from the qantity $item['quantity'] -= 1; // if item quantity 0 or less if($item['quantity'] <= 0) unset($_SESSION["viks_cart_array"][$index]); // remove current item from array break; } } header("location:" . $_SERVER["PHP_SELF"]); exit; }; Edited February 14, 2014 by Ch0cu3r Quote Link to comment Share on other sites More sharing options...
Solution arunpatal Posted February 14, 2014 Author Solution Share Posted February 14, 2014 Pyshco array structure is the way to go, as you can immediatly look up the items quantiy using its id as the key to $_SESSION["viks_cart_array"]. Rather then looping over each item one by one checking for items id matches. But working with your current array structure, this will remove the item from the array if the items quantity becomes 0 or less //remove one quantity from item if (isset ($_GET["remove"])) { $x = $_GET["remove"]; foreach($_SESSION["viks_cart_array"] as $index => &$item) { if ($item['item_id'] == $x) { // take 1 away from the qantity $item['quantity'] -= 1; // if item quantity 0 or less if($item['quantity'] <= 0) unset($_SESSION["viks_cart_array"][$index]); // remove current item from array break; } } header("location:" . $_SERVER["PHP_SELF"]); exit; }; I got your point.... Your code work but i will change my code to make life easy.... Quote Link to comment Share on other sites More sharing options...
arunpatal Posted February 14, 2014 Author Share Posted February 14, 2014 So finally i comeup with this //remove one quantity from item if (isset ($_GET["index"])) { $index = $_GET["index"]; if ($_SESSION["viks_cart_array"][$index]["quantity"] <= 1){ unset ($_SESSION["viks_cart_array"][$index]); } else{ $q = $_SESSION["viks_cart_array"][$index]['quantity']; $_SESSION["viks_cart_array"][$index]['quantity'] = $q - 1; header("location:" . $_SERVER["PHP_SELF"]); } }; Code is working fine but please correct me if it can be better Thanks to all Quote Link to comment Share on other sites More sharing options...
Ch0cu3r Posted February 14, 2014 Share Posted February 14, 2014 (edited) You need to check the quantity after you have taken 1 away. if (isset ($_GET["index"])) { $item_id = $_GET["index"]; // make sure key exists if(isset($_SESSION["viks_cart_array"][$item_id ])) { // now take one away from quantity $_SESSION["viks_cart_array"][$item_id ]['quantity'] -= 1; // check quantity if its zero or less if ($_SESSION["viks_cart_array"][$item_id]["quantity"] <= 0){ unset($_SESSION["viks_cart_array"][$item_id ]); // remove } header("location:" . $_SERVER["PHP_SELF"]); exit; } else { // item doesn't exist // display or log error here } }; Edited February 14, 2014 by Ch0cu3r Quote Link to comment Share on other sites More sharing options...
Psycho Posted February 16, 2014 Share Posted February 16, 2014 You need to check the quantity after you have taken 1 away. Not with the code he posted. He first checks if the quantity is 1 or less. If so, he removed the item. So, in the else condition, he is guaranteed that the quantity is 2 or greater. Thus, it would never be 0 when reduced by 1. But, on general principal I agree that your version is better. Less branching logic results in cleaner code. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.