#php #arrays #session
#php #массивы #сессия
Вопрос:
Я пытаюсь отредактировать данные массива, используя сеанс и цикл.
Ожидаемый результат в этом коде — редактирование конкретных данных внутри цикла, но проблема в том, что редактируются другие данные. Пожалуйста, помогите мне с этой проблемой, спасибо.
ПРИМЕЧАНИЕ: Если значение $cart_action
равно add
, будут добавлены новые данные, но если значение $values['type']
равно $_POST['type']
, будет отредактировано конкретное количество продукта.
Например, я хочу отредактировать кол-во product_id MQFUQ, но я понятия не имею, как это отредактировать, раздел product_id всегда редактируется. //массив данных ( [0] => Массив ( [product_number] => NP1DC [product_id] => 28AHT [тип] => SOLOZ [кол-во] => 1 )
[1] => Array
(
[product_number] => DZRW8
[product_id] => 28AHT
[type] => SHAREZ
[qty] => 1
)
[2] => Array
(
[product_number] => 4G0RY
[product_id] => MQFUQ
[type] =>
[qty] => 2
)
[3] => Array
(
[product_number] => ZS1C6
[product_id] => 28AHT
[type] => SOLOZ
[qty] => 1
)
)
//here's my code
$result = 0;
$values_type = "";
foreach($_SESSION["shopping_cart"] as $keys => $values)
{
$values_type = $values['type'];
if($values["product_id"] == $_POST["product_id"] amp;amp; $values['type'] == $_POST['type'])
{
$item_array = array(
'product_number' => $values['product_number'],
'product_id' => $_POST["product_id"],
'type' => $_POST["type"],
'qty' => $_POST['qty'] $values['qty']
);
$_SESSION["shopping_cart"][$keys] = $item_array;
$result = $keys;
$cart_action = "edit";
}
else {
$values_type = $values['type'];
$count = count($_SESSION["shopping_cart"]);
$item_array = array(
'product_number' => $product_number,
'product_id' => $_POST["product_id"],
'type' => $_POST["type"],
'qty' => $_POST['qty']
);
$result = $count;
$cart_action = "add";
}
}
if ($cart_action == "add") {
$_SESSION["shopping_cart"][$result] = $item_array;
echo $cart_action ." ". $values_type;
}
elseif ($cart_action == "edit") {
$_SESSION["shopping_cart"][$result] = $item_array;
echo $cart_action ." ". $values_type;
}
else {
echo "";
}
Комментарии:
1. Было бы полезно, если бы вы показали исходный массив (репрезентативный образец
var_export()
) и целевой массив.2. @jibsteroos Привет, я уже отредактировал свой пост, пожалуйста, проверьте, есть ли у вас время, спасибо, сэр.
3. Прежде всего — если ретранслировать ваш код здесь, продукт всегда будет добавляться, а не учитываться. Вы проверяете две вещи на соответствие типу сеанса и product_id. Но, учитывая var_dump, тип всегда отличается. Во-вторых, зачем делать это так сложно? проверьте идентификатор продукта элемента сеанса, если он есть, кол-во элементов сеанса 1, иначе добавьте новый продукт
Ответ №1:
$values_type = "";
foreach($_SESSION["shopping_cart"] as $keys => $values)
{
$values_type = $values['type'];
if($values["product_id"] == $_POST["product_id"] amp;amp; $values['type'] == $_POST['type'])
{
$item_array = array(
'product_number' => $values['product_number'],
'product_id' => $_POST["product_id"],
'type' => $_POST["type"],
'qty' => $_POST['qty'] $values['qty']
);
$_SESSION["shopping_cart"][$keys] = $item_array;
$result = $keys;
$cart_action = "edit";
} else {
$values_type = $values['type'];
$count = count($_SESSION["shopping_cart"]);
$item_array = array(
'product_number' => $product_number,
'product_id' => $_POST["product_id"],
'type' => $_POST["type"],
'qty' => $_POST['qty']
);
array_push($_SESSION["shopping_cart"], $item_array); //adds the item array as a new element in the shopping_cart array
$result = $count;
$cart_action = "add";
}
}
Я надеюсь, что это решит вашу проблему. Проблема заключалась в том, что вы устанавливали $result
or $cart_action
внутри цикла. Эти значения изменяются с каждой итерацией цикла, поэтому ваши значения могут отличаться от тех, которые вы предполагали после цикла, эти значения будут определены только на последней итерации.
Комментарии:
1. Привет, спасибо, сэр, но проблема все та же, если я редактирую значение, система добавляет новый массив, например, я добавляю товар в свою корзину, затем, если я снова нажму добавить в корзину, вместо редактирования значения будет добавлен тот же товар.
2. проблема в том, что, например, если массив равен 3, и я помещаю оператор if else внутри цикла, вместо 1 product_id отображается только 3 product_id .
Ответ №2:
Если тип не так важен, то, может быть, что-то в этом роде?
<?php
$result = 0;
$values_type = "";
foreach($_SESSION["shopping_cart"] as $keys => $values) {
$values_type = $values['type'];
if($values["product_id"] == $_POST["product_id"]) // remove that! amp;amp; $values['type'] == $_POST['type'])
{
/*
$item_array = array(
'product_number' => $values['product_number'],
'product_id' => $_POST["product_id"],
'type' => $_POST["type"],
'qty' => $_POST['qty'] $values['qty']
);
*/
$_SESSION["shopping_cart"][$keys]["qty"] = $_POST['qty'];
$cart_action = "edit";
}
else {
$values_type = $values['type'];
$count = count($_SESSION["shopping_cart"]);
$_SESSION["shopping_cart"][$count] = array(
'product_number' => $product_number,
'product_id' => $_POST["product_id"],
'type' => $_POST["type"],
'qty' => $_POST['qty']
);
$result = $count;
$cart_action = "add";
}
}
?>
Обновить
Кроме того, вот еще о чем нужно подумать — если тип представляет собой какой-то разделитель (например, цвет или размер), то это, по сути, другой товар (товар) в корзине, как еще вы узнаете, что и сколько нужно. Кроме того, вы должны иметь возможность редактировать сеансы, не используя их всегда — например, используя amp; operator в foreach .