这里如何使用$ i ++来查找正确数组元素的索引

时间:2015-07-13 03:44:51

标签: php sql multidimensional-array

如果购物车数组为空,则将商品ID和显示数量显示为1。如果没有它进入foreach循环,如果该项已经在数组array_splice发生在那里。偏移位置的$ i ++和$ i-1如何在这里工作。什么是逻辑

if (isset($_POST["pid"])) {
    $pid = $_POST["pid"];
    $wasfound = false;
    $i = 0;
    if ( ! isset($_SESSION["cart_array"]) || count($_SESSION["cart_array"]) < 1) {
        $_SESSION["cart_array"] = array(
            0 => array(
                "item_id" => $pid,
                "quantity" => 1
            )
        );
    } else {
        foreach ($_SESSION["cart_array"] as $each_item) {
            $i++;
            while (list($key, $value) = each($each_item)) {
                if ($key == "item_id" && $value == $pid) {
                    array_splice($_SESSION["cart_array"], $i-1, 1, array(
                        array(
                            "item_id" => $pid,
                            "quantity" => $each_item['quantity'] + 1
                        )
                    ));
                    $wasfound = true;
                }
            }
        }
        if ($wasfound == false) {
            array_push($_SESSION["cart_array"], array(
                "item_id" => $pid,
                "quantity" => 1
            ));
        }
    }
    header("location: cart.php"); 
    exit();
}

2 个答案:

答案 0 :(得分:1)

$ i跟踪for循环当前正在处理的数组的索引。这类似于将foreach写成:

for($i=0;$i<count($_SESSION['cart_array']);$i++){
    ...
}

代码使用$ i,因此它知道找到的元素在$ _SESSION [&#39; cart_array&#39;]中的哪个索引,因此可以将其拼接出来。由于它们在for循环开始时递增$ i(使用$ i ++),因此在找到元素时需要递减它($ i-1)。将$ i ++行放在for循环的底部将消除对减量的需要,然后$ i-1可以在array_splice方法中用$ i替换。

您可以在此处阅读有关array_splice方法的更多信息http://php.net/manual/en/function.array-splice.php。请注意,它需要索引(偏移)。

答案 1 :(得分:1)

如果您阅读array_splice上的手册,您会看到偏移参数不是数组元素的键(或索引

  

如果偏移为正,则移除部分的开始位于距输入数组开头的偏移处。如果offset是负数,那么它将从输入数组的末尾开始。

而是它是数组中元素的位置。换句话说,$i表示此处数组中元素的位置,而不是该元素的键。

所以在下面的代码中......

$arr = ['foo' => 'bar', 'baz' => 'quix'];
array_splice($arr, 1, 1);
var_dump($arr);

会给你......

array(1) {
  ["foo"]=>
  string(3) "bar"
}

其余逻辑非常简单。