【问题标题】:Updating a specific key within a multidimensional array (PHP)更新多维数组中的特定键 (PHP)
【发布时间】:2018-11-28 13:01:30
【问题描述】:

我在更新我创建的多维数组中的数量值时遇到了一些困难,真的希望你能帮助我纠正我出错的地方;

.

背景

我有两个“项目”,它们都有一个简单的表单标签,后跟一个具有唯一值的隐藏输入字段(第一个项目为 1,第二个项目为 2)。 该按钮将仅使用 POST 方法指向同一页面。

然后页面右侧的 div 将加载一个“篮子”,该篮子将使用这些帖子值并将它们添加到数组中。

当再次使用“添加”按钮时,该值应更新为 +1,而不是创建另一个子数组。

.

目前正在发生的事情

目前,当我第一次单击“添加”时,它会按预期添加数组;

但是,当第二次单击“添加”时,它会添加第二个数组,而不是数量上的 +1。

在第三次点击“添加”时,它现在确实找到了原始值并按照我的预期进行了更新,如果我一次又一次点击它会继续更新数量

这似乎是我第二次点击“添加”。

.

脚本

<?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>

另外,您可能会从我的脚本中注意到,当您“添加”第二个项目时,它实际上会通过从头开始创建数组来覆盖第一个项目,所以如果您可以帮助我解决其中一个或两个问题,我真的将不胜感激!

在此先感谢大家!

【问题讨论】:

  • 如果没有示例表格,这很难理解。

标签: php algorithm multidimensional-array logic


【解决方案1】:

我尝试调试您的代码,可能的解决方案如下:

<?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 中创建一个购物车数组(因此您不需要遍历购物车数组来查找商品)和 一个数组,其属性为 name=>每个项目的值。

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>

【讨论】:

    【解决方案2】:

    如果没有示例表单,很难测试您的代码,但我想您的两个问题都可以通过替换来解决:

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

    为:

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

    顺便说一句,当您要发布代码时,请尝试正确缩进代码。很难读。

    【讨论】:

    • 感谢 Cool Guy,我已按照您的建议添加了示例表单,同时我会试一试
    • 这不起作用,在添加第一个项目然后单击“添加”第二个之后它只是停止处理然后我在屏幕上看不到我的任何篮子或项目,直到我重置数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2016-07-05
    相关资源
    最近更新 更多