Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]problem ze zmienną tablicową
sazian
post
Post #1





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


witam,
napisałem prostą funkcję usuwającą wybrane elementy z pliku xml
  1. public function delete($element,$name){
  2. $xml = simplexml_load_file('plik.xml');
  3. for($i=0;$i<count($xml);$i++)
  4. {
  5.  
  6. if($xml->$element[$i]->attributes()->name==$name)
  7. {
  8. unset($xml->$element[$i]);
  9. }
  10. }
  11. (zapis do pliku)
  12.  
  13. }

jednak pojawił się mały problem
otóż zmienna $element przekazywana jako parametr jest stringiem więc zapis $element[$i] odwołuje się do litery a nie elementu tablicy
i tu powstaje pytanie
w jaki sposób mogę się odwołać do wybranego elementu tablicy a nie litery (IMG:style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
bmL
post
Post #2





Grupa: Zarejestrowani
Postów: 301
Pomógł: 25
Dołączył: 15.07.2007
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


  1. $$element[$i]

(IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/smile.gif)

Ten post edytował bmL 14.04.2010, 14:45:05
Go to the top of the page
+Quote Post
sazian
post
Post #3





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


nie pomogło
Warning: main::delete() [main.delete]: Node no longer exists in main.php on line 42

linia 42 to if($xml->$$element[$i]->attributes()->name==$name)

przy pojedynczym dolarze jest dokładnie tan sam błąd

Ten post edytował sazian 14.04.2010, 15:26:09
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Wyświetl mi proszę zawartość $xml, $element i $name umieszczając przed pętlą for kod
  1. echo '<pre>'; print_r($xml); echo '</pre><br />element: ' . $element . ' name: ' . $name;
Może wtedy będę w stanie Ci pomóc.
Go to the top of the page
+Quote Post
sazian
post
Post #5





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


Kod
SimpleXMLElement Object
(
    [controller] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [name] => nowy
                        )

                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [name] => nowy2
                        )

                )

        )

)

element: controller name: nowy2
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Wypróbuj:
  1. public function delete($element, $name) {
  2. $xml = simplexml_load_file('plik.xml');
  3. foreach ($xml->$element as $node) {
  4. if ($node->attributes()->name == $name) {
  5. unset($node);
  6. }
  7. }
  8. // zapis do pliku
  9. }
Chyba działa (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sazian
post
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


już tak próbowałem (IMG:style_emoticons/default/winksmiley.jpg) nie działa

foreach tworzy dodatkową zmienną
więc unset usuwa tą dodatkową zmienną a nie element na który wskazuje
Go to the top of the page
+Quote Post
mortus
post
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Rozumiem, że plik xml wygląda tak:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <controllers>
  3. <controller name="nowy" />
  4. <controller name="nowy2" />
  5. </controllers>
Jeśli tak, to pętla, która usunie odpowiedni węzeł powinna wyglądać tak:
  1. for($i = 0; $i < count($xml->$element); $i++) {
  2. if ($xml->{$element}[$i]->attributes()->name == $name) {
  3. unset($xml->{$element}[$i]);
  4. }
  5. }
Masz rację co do poprzedniego kodu. "Popełniłem" niedopatrzenie. Wyjaśnienie dla tego rozwiązania. Otóż zmienna $element to nic innego, jak nazwa, ale nazwa tablicy. Kod
$xml->$element
odwołuje się w tym przypadku do pola obiektu $xml o nazwie $element, jednak nie odwołuje się on do tablicy (wartości), jaka pod tą nazwą jest zapisana. Aby się do tej tablicy odwołać musimy użyć nawiasów { i }. Kod
$xml->{$element}
odwołuje się do tablicy, zapisanej w polu obiektu $xml o nazwie $element.

Ten post edytował mortus 14.04.2010, 17:49:21
Go to the top of the page
+Quote Post
sazian
post
Post #9





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


tego mi właśnie brakowało (IMG:style_emoticons/default/smile.gif)
dzięki wielkie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 10:38