PHP - 从字符串中删除字符不会更改strlen()

时间:2017-09-02 00:59:15

标签: php string session

我正在为网店编制购物车的过程。现在,我正在尝试添加“从购物车中删除”按钮。

我设置的方式是$_SESSION['id']包含客户添加到购物车的所有产品ID,然后循环创建一个包含5列的表:img |名字|尺寸|价格| “从购物车中删除”-Button。

我的目标是点击按钮后,只需从$_SESSION['id']移除产品即可。由于变量中现在少了一个项目,strlen($_SESSION['id'])也应该降低一个。

每个按钮都有一个唯一的名称,这要归功于for循环将当前迭代添加到其名称中:<td valign="middle"><form action="#" method="post"><input type="submit" name=" delete_<?php echo $i; ?>" value="Remove"></form></td>

为了检查是否按下了其中一个按钮,我合并了另一个for循环:

if (isset($_SESSION['id'])) {
    for ($i=0; $i < strlen($_SESSION['id']); $i++) { 
        if (isset($_POST['delete_'.$i])) {
            $_SESSION['id'][$i]=""; //removes item from $_SESSION['id']. Instead of "" I also tried NULL
            $_SESSION['size'][$i]=false; //removes corresponding size.
            //I may be mistaken, but PRG should be implemented to avoid problems with the form being resent upon refreshing the page
            header("Location: ".$_SERVER['REQUEST_URI']);
            exit();
        }
    }
}

单击按钮后,该项目确实已从$_SESSION['id']字符串中删除,但奇怪的是字符串长度保持不变。

在购物车中添加和删除3件商品后执行了var_dump ($_SESSION['id']);,结果为:string(3) ""。那么,字符串的长度为3但不包含任何内容?怎么会这样?

这显然会带来一些挑战!由于表行是基于strlen($_SESSION['id'])创建的,因此我留下了3行(或者我从购物车中删除了多少产品),这些行充满了错误消息,告诉我“未定义的索引”。虽然它没有说“未初始化的字符串偏移”,所以这对我来说意味着存在偏移,但是没有任何东西可以使用。

任何帮助都会被强烈谴责! 菲利克斯

1 个答案:

答案 0 :(得分:2)

无法更改字符串的长度。将空字符串分配给字符串字符时,它不会将所有其他字符移位,它会将其视为在该位置放置代码为0的字符。您可以使用以下代码查看它:

$str = "abcdef";
$str[1] = "";
echo $str; //acdef
echo ord($str[1]); // 0

所以它相当于:

$str[1] = chr(0);

相反,如果您尝试分配多个字符,它只会分配第一个字符:

$str[1] = "xyz";

表现得像:

$str[1] = "x";

请勿尝试将字符串用作数组,这不是它的目的。使用真实数组,然后您可以使用unset($_SESSION['id'][$i]);