如果购物车数组为空,则取商品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();
}
$i跟踪for循环当前正在处理的数组的索引。这类似于将foreach写成:
for($i=0;$i<count($_SESSION['cart_array']);$i++){
...
}
代码使用$i,以便它知道在$_SESSION['cart_array']中找到的元素位于哪个索引,以便它可以将其拼接出来。由于它们在for循环开始时增加$i(使用$i++),因此在找到元素时需要减少它($i-1)。将$i++行放在for循环的底部将消除对减量的需要,然后在array_splice方法中将$i-1替换为$i。
你可以在这里阅读更多关于array_splice方法http://php.net/manual/en/function.array-splice.php。注意,它需要一个索引(偏移量)。
如果你阅读了array_splice的手册,你会发现offset参数不是数组元素的键(或索引)。
如果offset为正数,则移除部分的起始位置与输入数组的起始位置相对。如果offset为负,则从距离输入数组末尾很远的地方开始。
是元素在数组中的位置。换句话说,$i
表示数组中元素的位置,而不是该元素的键。
那么在下面的代码中…
$arr = ['foo' => 'bar', 'baz' => 'quix'];
array_splice($arr, 1, 1);
var_dump($arr);
Would give you…
array(1) {
["foo"]=>
string(3) "bar"
}
其余的逻辑非常简单。