UNSET不会永久删除/取消设置数组值

时间:2013-01-08 15:32:37

标签: php google-maps unset

我为Google地图应用程序提供了以下脚本。有关特定位置的信息通过ajax发送到$ array数组,然后将其添加到$ SESSION ['infomarker']。这部分工作正常。但是用户也应该能够删除一个地方(如果他们后悔输入)。

这由removeElementWithValue()函数处理,该函数将places和lat作为参数(此示例脚本中为$ val1和$ val2)。包含'val1'和'val2'值的数组然后就像它们应该消失一样。但是当我将$ val1和$ val2变量更改为'val3'和'val4'时,包含'val1'和'val2'的数组返回,而包含'val3'和'val4'的数组未被设置。

我认为unset()'unset'有问题的数组是好的,还是我还需要做其他事情?

<?php
session_start();


if(isset($_POST['lat']) && !empty($_POST['lat']) ) {
$array = array(
                'titel' => $_POST['titel'], 
                'comment' => $_POST['comment'], 
                'lat' => $_POST['lat'], 
                'lng' => $_POST['lng'] 
                );


$_SESSION['infomarker'][] = $array;


   }    

  $val1 = 'val1';

  $val2 = 'val2';


  $newarray = removeElementWithValue($_SESSION['infomarker'], "titel", "comment", $val1, $val2);

 function removeElementWithValue($array, $key1, $key2, $value1, $value2){
 foreach($array as $subKey => $subArray){
      if($subArray[$key1] == $value1) {
      if($subArray[$key2] == $value2) 

         unset($array[$subKey]);

      }

   }
return $array;

}

print_r($newarray);

2 个答案:

答案 0 :(得分:2)

您正在修改传递给$array方法的removeElementWithValue。您正在将$_SESSION数组传递给方法。

unset通过删除$array中的值来实现预期目标。但是,您的方法实际上是接收$_SESSION变量的副本,因为PHP将按值传递数组而不是按引用传递。

您可以在函数声明中为$array变量加前缀一个amperstand(&amp;)字符,这将告知PHP将该变量传递给函数by-reference,并将导致对该数组进行任何修改在函数内部更改源数组($_SESSION)。

澄清:

调用函数会在该方法的“堆栈”中创建一个范围。默认情况下,PHP按值传递所有内容(对于那些想要通过引用传递对象的人来说 - 它们不是。对象的引用是按值传递的。)

这是什么意思?嗯,它比看起来容易。请参考以下代码:

function myfunc($value) {
  $value = $value + 1;
}

$testing = 1;
myfunc($testing);
var_dump($testing);

这将输出int(1)。注意,即使我们增加函数内部的值,结果也不会改变$testing变量。这是因为$testing变量在堆栈内的不同范围内声明。就PHP而言,当我们调用该方法时,我们实际上调用了这个myfunc(1)(注意数字而不是变量)。变量的值从内存中获取,并将该值传递给方法。

这是传递参考派上用场的地方。您可以通过在函数定义中使用amperstand前缀任何参数来指示PHP通过引用传递,因此您可以得到:

function myfunc(&$value) {
  $value = $value + 1;
}

$testing = 1;
myfunc($testing);
var_dump($testing);

添加简单的&符号现在将使此代码打印int(2)

那有什么区别?嗯,你会记得我说我们第一次基本上打电话给myfunc(1)。第二次,我们有效地调用myfunc(0xff940ac4),其中0xff940ac4$testing变量的内存地址。现在,我们对方法内部$value所做的任何更改都会更改内存地址0xff940ac4的数据,而不是“复制”到此方法范围内的值。

答案 1 :(得分:1)

也就是说,因为在PHP中,默认情况下,数组不是按引用传递的,而是按值传递的。因此,您正在使用的函数将从函数内的$array中删除值。但这不会修改功能。如果你想拥有这种行为,你应该让PHP传递值by-reference

您可以通过更改功能定义来执行此操作:

function removeElementWithValue(&$array, $key1, $key2, $value1, $value2)
{ ... }