- ベストアンサー
PHP SimpleXML unsetについて
- SimpleXMLにて特定のノードを検索し、検索結果を削除する方法について学んでいます。
- 検索結果をforeachで直接使用するか、変数にセットして利用するかで、削除の方法が異なることに気付きました。
- 初心者なので、変数にセットするとunsetで削除されなくなる理由がわかりません。どなたか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
削除1は、 $items = $xml->xpath($name . '[' . $column . '="' . $value . '"]'); foreach( $items as $item ) { unset($item); //ここがunset($item[0]);になるのではないでしょうか。 $ret ++; } これで多分同じ動作になると思いますがいかがでしょう。 尚、 foreachで$itemに参照コピーされたオブジェクトを、unsetしても、参照から外れるだけなので、 値そのものは消えません。 $itemにコピーされて、その$itemにある「0」という要素をunsetすると、$itemの参照元からは「0」という要素が消えます。 <?php //適当なクラスがあったとして class Example{ public $value = ""; } //変数$dataでインスタンスを作成 $data = new Example(); //ソレを変数$data2にコピー $data2 = $data; //コピーされた$data2でクラスのメンバ変数に値を代入 $data2->value = "test"; echo $data->value .PHP_EOL; //出力は、「test」 echo $data2->value .PHP_EOL; //出力は「test」 //変数$data2をunsetした! unset($data2); //でも$data2が参照しなくなっただけで //もとは生きているので echo $data->value; //出力は「test」 ?>
その他の回答 (1)
- hogehoge78
- ベストアンサー率80% (433/539)
PHPには、インターフェイスという物があって、自前のクラスなどにそのインターフェイスを実装することで、色々なことが出来ます。 ・Iterator クラスオブジェクトを、foreachに突っ込んでやると配列のようにループさせることが出来る http://jp2.php.net/manual/ja/class.iterator.php ・ArrayAccess クラスオブジェクトに、配列のようにアクセスすることが出来る。 http://jp2.php.net/manual/ja/class.arrayaccess.php 他にも色々ありますが、このSimpleXMLElementという組み込みクラスには、恐らく、上記の二つが実装されているのではないかなぁと思います。(マニュアルには、Traversableのみの実装のようですが) その為、帰ってきたクラスオブジェクトを、配列のようにアクセスし操作することが出来るのだと思います。
お礼
ありがとうございます。 おそらく私が理解していないのは、「ArrayAccess」なのかと思われます。 教えていただいたURLのマニュアルで、なぞは解けませんでしたが、 「ArrayAccess」か「SimpleXMLElement」を調べていけば、 なぞも解けていきそうです。 ありがとうございましたm(_ _)m
お礼
ありがとうございます。 おっしゃるとおり$item[0]で削除できました。 よくよく見ると「削除2」も同じ事をやっていました(^^;) ありがとうございます。 ただ、なぜ参照コピーされた$itemを$item[0]と 指定すると参照元を指定できるのが不明です。 ちなみにデバックして$item[100]などを指定しても エラーとはならず、$itemと同じ物を参照しているようです。 $itemは配列ではないと、私は思っているので $item[0]や$item[100]など使用するとエラーに なると思っていたのですがなぜこのようになるのでしょうか? たびたび質問で申し訳ありません。 宜しくお願い致します。