【问题标题】:UNSET doesnt remove/unset array values permanentlyUNSET 不会永久删除/取消设置数组值
【发布时间】:2012-12-22 12:15:18
【问题描述】:

我有以下用于 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);

【问题讨论】:

    标签: php google-maps unset


    【解决方案1】:

    您正在修改传递给您的removeElementWithValue 方法的$array。您正在将 $_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 所见,当我们调用该方法时,我们实际上调用了这个 myfunc(1)(注意数字而不是变量)。变量的值是从内存中获取的,然后将该值传递给方法。

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

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

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

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

    【讨论】:

    • 好的,不太清楚你的意思是什么,但我添加了 & 符号,它成功了。我将不得不阅读这个!非常感谢!
    • 好的,不太清楚这意味着什么,但我添加了 & 符号,就成功了。我将不得不阅读这个!非常感谢!
    • 刚刚添加了一个大解释 - 如果这有帮助,请告诉我。
    • 非常好的解释,即使我现在也理解其中的区别了 :) 感谢您花时间解释这一点!
    【解决方案2】:

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

    您可以通过像这样更改函数定义来做到这一点:

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

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 2015-08-24
      • 2020-03-15
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多