Обновление определенного ключа в многомерном массиве (PHP) - PullRequest
0 голосов
/ 28 ноября 2018

Я испытываю некоторые трудности при обновлении количественного значения в многомерном массиве, который я создал, и очень надеюсь, что вы поможете мне исправить то, в чем я ошибся;

.

Фон

У меня есть два "элемента", каждый из которых имеет простой тег формы, за которым следует скрытое поле ввода с уникальным значением (1 для первого элемента, 2 длявторой).Кнопка просто укажет на эту же страницу, используя метод POST.

Div в правой части страницы загрузит «корзину», которая будет использовать эти значения записей и добавит их в массив.

Когда кнопка «добавить» используется снова, значение должно обновиться до +1, а не создавать другой sub_array.

.

Что происходит в данный момент

В настоящее время, когда я нажимаю «добавить» в первый раз, он добавляет массив, как и ожидалось;

Result 1

Однако при нажатии «добавить»во второй раз он добавляет второй массив вместо + 1 в количестве.

Result 2

При третьем нажатии кнопки «добавить» это действительноТеперь найдите исходное значение и обновите его, как я ожидал, если я нажму снова и снова, он продолжит обновлять количество

Result 3

Это просто кажетсявторой раз я нажимаю «добавить».

.

The Script

<?php session_start();

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

if (ISSET($_POST["prod"]))
{
    if(in_array($_POST["prod"],$_SESSION["cart"])==TRUE)
    {
      $_SESSION["cart"][0] = 
      array($_POST["prod"],$_POST["name"],$_SESSION["cart"][0][2]+1);
    }
    else{
         echo 'running else';
         $_SESSION["cart"]=array($_POST["prod"],$_POST["name"],1);}}

         if ($_POST['e']=='1')
         {
           $_SESSION['cart'] = '';
         }
        echo '<br /><br />';
print_r($_SESSION["cart"]);
}

Пример формы

<form action="test.php" method="post" enctype="application/x-www-form-urlencoded">
MAST-O-MIR<br/>
img<br/>
£2.00<br/>
        <input type="hidden" value="1" name="prod" />
        <input type="hidden" value="MAST-O-MIR" name="name" />
    <button class="plus-btn" type="Submit">Add</button>
</form>

Кроме того, из моего сценария вы могли бы заметить, что когда вы «добавляете» второй элемент, он фактически перезаписывает первый, создавая массив с нуля, так чтоесли вы можете помочь мне с обоими или обоими из них, я бы очень признателен за опыт!

Большое спасибо всем заранее!

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я попытался отладить ваш код, и возможное решение может быть следующим:

<?php

 session_start();

if(!isset($_SESSION["cart"]))
{
    $_SESSION["cart"]=[];
}

if (isset($_POST["prod"]))
{
    $prod_id=$_POST["prod"];
    //let suppose $_POST['prod'] is your item id
    $found=false;
    for($i=0;$i<count($_SESSION['cart']);$i++)
    {
        if(isset($_SESSION['cart'][$prod_id]))
        {
            echo "found! so add +1";
            $_SESSION['cart'][$prod_id][2]+=1;
            $found=true;
            break;
        }
    }
    if($found==false)
    {
        echo 'not found! so create a new item';
        $_SESSION["cart"][$prod_id]=array($_POST["prod"],$_POST["name"],1);
    }
}

         if (isset($_POST['e']) && $_POST['e']=='1')
         {
             $_SESSION['cart'] = '';
         }

        echo '<br /><br />';
print_r($_SESSION["cart"]);

?>
<form action="cart.php" method="post" enctype="application/x-www-form-urlencoded">
    MAST-O-MIR<br/>
    img<br/>
    £2.00<br/>
    <input type="hidden" value="1" name="prod" />
    <input type="hidden" value="MAST-O-MIR" name="name" />
    <button class="plus-btn" type="Submit">Add</button>
</form>
<form action="cart.php" method="post" enctype="application/x-www-form-urlencoded">
    MAST-O-MIR<br/>
    img<br/>
    £2.00<br/>
    <input type="hidden" value="2" name="prod" />
    <input type="hidden" value="MAST-O-MIR" name="name" />
    <button class="plus-btn" type="Submit">Add</button>
</form>

Еще один способ сделать это - использовать ассоциативные массивы.Следующий код создает массив корзины в $ _SESSION, используя имя элемента в качестве ключа (поэтому вам не нужно перебирать массив корзины , чтобы найти элемент), и массив со свойствами в качестве имени => значенияза каждый предмет.

session_start();

if(!isset($_SESSION["cart"]))
{
    $_SESSION["cart"]=[];
}
//let's suppose you have unique names for items
if (isset($_POST["prod"]))
{
    $name=$_POST["name"];
    if(isset($_SESSION['cart'][$name]))
    {
        echo "found! so add +1";
        $_SESSION['cart'][$name]['quantity']+=1;
    }
    else
    {
       echo 'not found! so create a new item';
       $_SESSION["cart"][$name]=array("id"=>$_POST["prod"],"name"=>$_POST["name"],"quantity"=>1);
    }
}

         if (isset($_POST['e']) && $_POST['e']=='1')
         {
             $_SESSION['cart'] =[];
         }

        echo '<br /><br />';
print_r($_SESSION["cart"]);

?>
<form action="cart2.php" method="post" enctype="application/x-www-form-urlencoded">
    MAST-O-MIR<br/>
    img<br/>
    £2.00<br/>
    <input type="hidden" value="1" name="prod" />
    <input type="hidden" value="MAST-O-MIR" name="name" />
    <button class="plus-btn" type="Submit">Add</button>
</form>
<form action="cart2.php" method="post" enctype="application/x-www-form-urlencoded">
    MAST-O-MIR<br/>
    img<br/>
    £2.00<br/>
    <input type="hidden" value="2" name="prod" />
    <input type="hidden" value="MAST-OMIR" name="name" />
    <button class="plus-btn" type="Submit">Add</button>
</form>
0 голосов
/ 28 ноября 2018

Трудно протестировать ваш код без образца формы, но я думаю, что обе ваши проблемы могут быть решены путем замены:

$_SESSION["cart"][0] = array($_POST["prod"], $_POST["name"], $_SESSION["cart"][0][2]+1);

Для:

$_SESSION["cart"][0][2]+= 1;

Кстати,попробуйте правильно сделать отступ, когда вы собираетесь его опубликовать.Трудно читать.

...