0

Google マップ アプリケーション用の次のスクリプトがあります。特定の場所に関する情報は、ajax を介して $array 配列に送信され、$SESSION['infomarker'] に追加されます。この部分は正常に動作します。ただし、ユーザーは場所を削除することもできる必要があります (入力を後悔した場合)。

これは、場所 lat と lng を引数として取る removeElementWithValue() 関数によって処理されます (このサンプル スクリプトでは $val1 と $val2)。「val1」と「val2」の値を含む配列は、本来のように消えます。しかし、$val1 および $val2 変数を 'val3' および 'val4' に変更すると、'val3' および 'val4' を含む配列が設定解除されている間に、'val1' および 'val2' を含む配列が返されます。

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。ただし、$_SESSIONPHP は配列を参照ではなく値で渡すため、メソッドは実際には変数のコピーを受け取ります。

関数宣言内の変数の前にアンパースタンド (&) 文字を付けることができます$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)2 回目は、実質的に where is を変数0xff940ac4へのメモリ アドレスとして呼び出しています。$testingここで、メソッド内に変更を加えると、このメソッドのスコープに「コピー」された値ではなく、$valueメモリ アドレス のデータが変更されます。0xff940ac4

于 2013-01-08T15:37:27.780 に答える
1

これは、PHP ではデフォルトで配列が参照ではなく値で渡されるためです。したがって、使用している関数は、関数内から値を削除します$array。しかし、それは機能を変更しません。その動作をさせたい場合は、PHP に値を参照渡しさせる必要があります。

これを行うには、関数定義を次のように変更します。

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