Как я могу использовать ключ для изменения значения определенного многомерного массива? - PullRequest
2 голосов
/ 06 мая 2019

Я столкнулся с проблемой в многомерном массиве.Мне нужно изменить количество определенного набора продуктов в сеансе, если идентификатор и варианты выбора совпадают с одним из продуктов сеанса, и увеличить на 1 этот продукт.

продукт, который я публикую $newproduct

Array
(
    [id] => 2
    [title] => Vewlix 1080p (red and white)
    [image] => amazing-modern-villa-Freshome-02.jpg
    [variants] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [option_name] => Panel 2 players (+50 euros)
                    [option_price] => 50.00
                )

        )

    [quantity] => 1
    [unit_price] => 1950.00
    [price] => 2000
)

Вот мой $_SESSION['shopping_cart']:

Array
(
    [0] => Array
        (
            [id] => 2
            [title] => Vewlix 1080p (red and white)
            [image] => amazing-modern-villa-Freshome-02.jpg
            [variants] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [option_name] => Panel 1 player
                            [option_price] => 0.00
                        )

                )

            [quantity] => 2
            [unit_price] => 1950.00
            [price] => 1950
        )

    [1] => Array
        (
            [id] => 2
            [title] => Vewlix 1080p (red and white)
            [image] => amazing-modern-villa-Freshome-02.jpg
            [variants] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [option_name] => Panel 2 players (+50 euros)
                            [option_price] => 50.00
                        )

                )

            [quantity] => 1
            [unit_price] => 1950.00
            [price] => 2000
        )

    )

Код:

$products_in_cart = array_column($_SESSION["shopping_cart"], "id");
$key = array_search($newproduct["id"], $products_in_cart);

if ($key !== false) {
    $variants_in_cart = array_column($_SESSION["shopping_cart"][$key]["variants"], "id");
    $new_variants = array_column($newproduct["variants"], "id");
    sort($variants_in_cart);
    sort($new_variants);

    if (count(array_diff($variants_in_cart, $new_variants)) === 0) {
        $_SESSION["shopping_cart"][$key]["quantity"] += 1;
    } else {
        $_SESSION["shopping_cart"][] = $newproduct;
    }
} else {
    $_SESSION["shopping_cart"][] = $newproduct;
}

Пока у меня работает сравнение идентификаторов и вариантов,но когда размещается аналогичный продукт, вместо увеличения только определенного продукта с тем же идентификатором / вариантами, он увеличивает все количества продуктов моей сессии на + 1.

Как добавить +1 только к продукту с точнымтот же ID / варианты только?Я думаю, что мой [$ key] не работает, так как это должен быть фильтр, который увеличивает только необходимое количество продукта

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Нет необходимости перебирать массив таким образом.Начните с получения списка идентификаторов в корзине уже.Если есть совпадение, вытащите ключ из этого списка, проверьте варианты и приращение.В противном случае просто добавьте его.

<?php
$_SESSION["shopping_cart"] = json_decode('[{"id": 2, "quantity": 1, "variants": [{"option_id": 3}, {"option_id": 9}]}, {"id": 1, "quantity": 1, "variants": [{"option_id": 5}]}]', true);
$newproduct = json_decode('{"id": 2, "variants": [{"option_id": 3}, {"option_id": 9}]}', true);

$products_in_cart = array_column($_SESSION["shopping_cart"], "id");
$key = array_search($newproduct["id"], $products_in_cart);

if ($key !== false) {
    $variants_in_cart = array_column($_SESSION["shopping_cart"][$key]["variants"], "option_id");
    $new_variants = array_column($newproduct["variants"], "option_id");
    sort($variants_in_cart);
    sort($new_variants);
    if (count(array_diff($variants_in_cart, $new_variants)) === 0) {
        $_SESSION["shopping_cart"][$key]["quantity"] += 1;
    } else {
        $_SESSION["shopping_cart"][] = $newproduct;
    }
} else {
    $_SESSION["shopping_cart"][] = $newproduct;
}

var_dump($_SESSION["shopping_cart"]);

Вывод:

array(2) {
  [0] =>
  array(3) {
    'id' =>
    int(2)
    'quantity' =>
    int(2)
    'variants' =>
    array(2) {
      [0] =>
      array(1) {
        ...
      }
      [1] =>
      array(1) {
        ...
      }
    }
  }
  [1] =>
  array(3) {
    'id' =>
    int(1)
    'quantity' =>
    int(1)
    'variants' =>
    array(1) {
      [0] =>
      array(1) {
        ...
      }
    }
  }
}
0 голосов
/ 06 мая 2019

Ваша проблема не большая проблема.Возможно, вы просто захотите добавить правильный if в свои коды, чтобы сделать ++ для этого нового элемента, который вы можете получить.

Я не уверен в некоторых ваших переменных.Но я думаю, что вам может понадобиться if перед вашим array_push, может быть, что-то похожее на это:

        if ((int) $newproduct['id'] == (int) $value["id"]) {
            $_SESSION['shopping_cart'][$key]['quantity'] = (int) $_SESSION['shopping_cart'][$key]['quantity'] + 1;
        }

, и ваша проблема будет решена, если вы добавите правильный if, чтобы не добавлять ++ ко всем $value с.Этот также может работать:

        if ((int) $newproduct['id'] == (int) $value["id"]) {
            $_SESSION['shopping_cart'][$key]['quantity'] = (int) $value['quantity'] + 1;
        }

$_SESSION['shopping_cart'] = array
    (
    "0" => array
    (
        "id" => "2",
        "title" => "Vewlix 1080p (red and white)",
        "image" => "amazing-modern-villa-Freshome-02.jpg",
        "variants" => array
        (
            "0" => array
            (
                "option_id" => "1",
                "option_name" => "Panel 1 player",
                "option_price" => "0.00",
            ),

        ),

        "quantity" => "1",
        "unit_price" => "1950.00",
        "price" => "1950",
    ),

    "1" => array
    (
        "id" => "2",
        "title" => "Vewlix 1080p (red and white)",
        "image" => "amazing-modern-villa-Freshome-02.jpg",
        "variants" => array
        (
            "0" => array
            (
                "option_id" => "1",
                "option_name" => "Panel 2 players (+50 euros)",
                "option_price" => "50.00",
            ),

        ),

        "quantity" => "1",
        "unit_price" => "1950.00",
        "price" => "2000",
    ),

);

foreach ($_SESSION['shopping_cart'] as $key => $value) {
    if (in_array($newproduct['id'], $shopping_ids) && empty($variants_diff)) {
        if ((int) $newproduct['id'] == (int) $value["id"]) {
            $_SESSION['shopping_cart'][$key]['quantity'] = (int) $_SESSION['shopping_cart'][$key]['quantity'] + 1;
        }
    } else {
        array_push($_SESSION['shopping_cart'], $newproduct);
    }
}
...