我为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);
答案 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)
{ ... }