Редактировать данные массива внутри цикла — PHP

#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 .