从多维数组中删除数组

6

我有一个这样的会话:

array(3) {
  ["counter"]=>
  int(0)
  ["currentItem"]=>
  string(1) "2"
  ["addedToCart"]=>
  array(12) {
    [0]=>
    array(11) {
      ["aantal"]=>
      int(1)
      ["id"]=>
      string(1) "1"
      ["filmtitel"]=>
      string(11) "a_bugs_life"
      ["film_id"]=>
      string(1) "2"
      ["zaal_id"]=>
      string(1) "1"
      ["zaaltitel"]=>
      string(6) "zaal 1"
      ["tijdstip"]=>
      string(8) "15:00:00"
      ["stoeltjes"]=>
      string(2) "21"
      ["dag"]=>
      string(8) "woensdag"
      ["verwijder"]=>
      int(2)
      ["vertoningId"]=>
      string(1) "3"
    }
    [1]=>
    array(11) {
      ["aantal"]=>
      int(1)
      ["id"]=>
      string(1) "1"
      ["filmtitel"]=>
      string(11) "a_bugs_life"
      ["film_id"]=>
      string(1) "2"
      ["zaal_id"]=>
      string(1) "1"
      ["zaaltitel"]=>
      string(6) "zaal 1"
      ["tijdstip"]=>
      string(8) "15:00:00"
      ["stoeltjes"]=>
      string(1) "7"
      ["dag"]=>
      string(8) "woensdag"
      ["verwijder"]=>
      int(2)
      ["vertoningId"]=>
      string(1) "3"
    }
    [2]=>
    array(11) {
      ["aantal"]=>
      int(1)
      ["id"]=>
      string(1) "1"
      ["filmtitel"]=>
      string(11) "a_bugs_life"
      ["film_id"]=>
      string(1) "2"
      ["zaal_id"]=>
      string(1) "1"
      ["zaaltitel"]=>
      string(6) "zaal 1"
      ["tijdstip"]=>
      string(8) "15:00:00"
      ["stoeltjes"]=>
      string(2) "22"
      ["dag"]=>
      string(8) "woensdag"
      ["verwijder"]=>
      int(2)
      ["vertoningId"]=>
      string(1) "3"
    }
  }
}

现在,我想从$_SESSION['addedToCart']中删除符合某些条件的数组。我尝试了以下方法。

foreach ($_SESSION["addedToCart"] as $arr) {
       if ($arr["stoeltjes"] == $stoeltje && $arr['film_id'] == $id) {
            unset($arr);
       }
 }

这似乎不起作用,它没有删除任何内容。我使用var_dump检查变量$stoeltje和$id是否正确,它们都是正确的,所以那不可能是问题。在这种情况下我能否使用unset函数?

5个回答

8
foreach ($_SESSION["addedToCart"] as &$arr)

&将您的变量转换为引用而不是副本。通常这已足够。 unset()仅适用于当前范围内的数据(因此您的foreach循环),原始数据保持不变(有关详细信息,请参见unset())。

相反,您可以这样做:

foreach ($_SESSION["addedToCart"] as $key => $val)
{
    if ($val["stoeltjes"] == $stoeltje && $val['film_id'] == $id) {
        unset($_SESSION["addedToCart"][$key]);
   }
}

我按照你说的进行了修改: foreach ($_SESSION["addedToCart"] as &$arr) { if ($arr["stoeltjes"] == $stoeltje && $arr['film_id'] == $id) { echo"test"; unset($arr); } }但是它仍然不起作用,尽管 id 打印了 echo,所以我肯定进入了 if 语句。 - vincent

2
即使参考文献中提供的方法通常可以正常工作,这里还是提供一个没有参考文献的示例:
foreach ($_SESSION["addedToCart"] as $key => $arr) {
       if ($arr["stoeltjes"] == $stoeltje && $arr['film_id'] == $id) {
            unset($_SESSION["addedToCart"][$key]);
       }
 }

1

它不起作用,因为foreach是在副本上工作的,因此$arr只是主表中每个元素的副本。

来自php.net:

从PHP 5开始,您可以通过在$value之前加上&轻松修改数组元素。这将分配引用而不是复制值。

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)

我按照你的说法进行了修改:foreach ($_SESSION["addedToCart"] as &$arr) { if ($arr["stoeltjes"] == $stoeltje && $arr['film_id'] == $id) { echo"test"; unset($arr); } } 但它仍然不起作用,尽管它确实打印了echo,所以我肯定进入了if语句。 - vincent
是的。取消设置 $arr 只是删除了引用,主表仍然引用相同的东西。我会修复它,但你已经得到了一个完整的答案 ;) - naugtur

1

试试这个:

$arr = array(1, 2, 3, 4); 
foreach ($arr as $key => &$value) { 
    if ($value == 2)
    {
        unset($arr[$key]);
    }
} 
print_r($arr);

0

remove_array_key("film_id", $array);

删除数组键名为"film_id"的元素。

function remove_array_key($key, &$array)
{
    $result = array_key_exists($key, $array);

    if ($result) {
        unset($array[$key]);
        return $array;
    }

    foreach ($array as &$v) {
        if (is_array($v)) {
            $result = remove_array_key($key, $v);
        }
        if (is_array($result)) {
            unset($v[$key]);
            return $array;
        }
    }

    return false;
}

链接到Github解释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接