0

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

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

我认为 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);
4

2 回答 2

2

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

unset通过从$array. 但是,您的方法实际上是接收$_SESSION变量的副本,因为 PHP 将按值而不是按引用传递数组。

您可以$array在函数声明中为变量添加前缀 (&) 字符,这将通知 PHP 通过引用将该变量传递给函数,并将导致对函数内部数组所做的任何修改都会更改源数组( $_SESSION)。

澄清:

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

这意味着什么?嗯,这比看起来容易。拿下面的代码:

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

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

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

这就是传递引用派上用场的地方。您可以通过在函数定义中的任何参数前加上一个符号来指示 PHP 通过引用传递,因此您会得到:

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

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

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

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

于 2013-01-08T15:37:27.780 回答
1

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

您可以通过更改函数定义来做到这一点,如下所示:

function removeElementWithValue(&$array, $key1, $key2, $value1, $value2)
{ ... }
于 2013-01-08T15:36:11.287 回答