php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.11.2009, 02:58  
Erfahrener Benutzer
 
Registriert seit: 06.11.2008
Beiträge: 212
stayInside befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Objekt Iteration Löschmethode

Hallo,

ich bin gerade am verzweifeln. Und zwar geh ich ein Objekt per foreach durch, in dem foreach kann es vorkommen das ich aus dem Objekt Daten löschen muss. Das Objekt sieht danach auch so aus wie es soll, allerdings stimmt etwas mit dem Zähler nicht.

Erstmal die Methode zum Löschen eines Datensatzes.

PHP-Code:
public function deleteObjectByPointer($intPointer)
{
    unset(
$this->arrObjectList[$intPointer]);

Aufgerufen wird die dann so

PHP-Code:
foreach ($objSitemapList as $intKey => $objSitemap)
{
    
$objSitemap->Selected false;

    if ((integer) 
$objSitemap->HeaderInvisible !== $intHeaderInvisible &&
        (integer) 
$objSitemap->FooterInvisible !== $intFooterInvisible)
    {
        
$objSitemapList->deleteObjectByPointer($intKey);

        continue;
    }
    
    if (
$objSitemap->Id == $this->objSitemap->Id)
    {
        
$objSitemap->Selected true;
    }

    
$objSitemap->Link '/' $objSitemap->Alias;

    if (
$objSitemap->Route 0)
    {
        
$objSitemap->Link $objRouteList->getObjectByField('Id'$objSitemap->Route)->RouteLink '/' $objSitemap->Alias;
    }

Danach gebe ich das "List" Objekt ans Template weiter, da versuche ich dann eine foreach anzuwenden, welche allerdings nicht durchlaufen wird
Ich vermute das der Pointer falsch gesetzt wird, aber hab schon alles mögliche und logische ausprobiert.

Benny
stayInside ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.11.2009, 03:06  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Hmm, also zumindest in C++ ist es meines Wissens nach so wenn man da während dem iterieren eines Iterators eines der Elemente des Iterators löscht und dann versucht weiter zu iterieren dass das böse in die Hose gehen kann.

Was sagt denn ein var_dump auf das List-Objekt nach dem löschen ?

Und was für einen Iterator verwendest du ? ArrayIterator auf $this->arrObjectList und dann das IteratorAggregate-Interface implementiert ?
robo47 ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:13  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Ich schätze dass Problem liegt daran, dass man Arrays nicht verwenden sollte während man sie modifiziert. Ich erinnere mich jedenfalls so daran, dass es irgendein Problem gab, wenn man ein Array in der gleichen Schleife verwendet und Einträge löscht. Versuch doch mal daraus zwei Schleifen zu machen, eine in der Einträge gelöscht werden und eine zweite für die Verwendung.

An deinem Design fällt mir zudem auf, dass dein Code evtl. in ein anderes Objekt gehört, Sitemap selbst wahrscheinlich. Wobei Routelist an die Methode übergeben oder als Feld von Sitemap gesetzt werden sollte.
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:13  
Erfahrener Benutzer
 
Registriert seit: 06.11.2008
Beiträge: 212
stayInside befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Hmm, also zumindest in C++ ist es meines Wissens nach so wenn man da während dem iterieren eines Iterators eines der Elemente des Iterators löscht und dann versucht weiter zu iterieren dass das böse in die Hose gehen kann.
Vermute ich so langsam auch

Zitat:
Was sagt denn ein var_dump auf das List-Objekt nach dem löschen ?
Danach ist alles i. O. Sowohl der Pointer als auch die Daten.


Zitat:
Und was für einen Iterator verwendest du ? ArrayIterator auf $this->arrObjectList und dann das IteratorAggregate-Interface implementiert ?
Vielleicht liegt auch da der Fehler. Deswegen hier mal mein Model.

PHP-Code:
abstract class LModel extends Model implements Iterator
{
    protected 
$intPointer     0;

    protected 
$arrObjectList  = array();

    public function 
getObjectByPointer($intPointer)
    {
        return (
$this->arrObjectList[$intPointer]);
    }

    public function 
deleteObjectByPointer($intPointer)
    {
        unset(
$this->arrObjectList[$intPointer]);
    }

    public function 
rewind()
    {
        
$this->intPointer 0;
    }

    public function 
key()
    {
        return (
$this->intPointer);
    }

    public function 
current()
    {
        if (isset(
$this->arrObjectList[$this->intPointer]))
        {
            return (
$this->arrObjectList[$this->intPointer]);
        }

        return (
false);
    }

    public function 
valid()
    {
        return (!empty(
$this->arrObjectList[$this->intPointer]));
    }

    public function 
count()
    {
        return (
count($this->arrObjectList));
    }

    public function 
next()
    {
        
$this->intPointer++;
    }

    public function 
clearData()
    {
        
$this->arrData = array();

        
$this->arrObjectList = array();

        
$this->rewind();
    }

stayInside ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:22  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Ich glaub nicht, dass es am Iterator liegt...
Hast du das Teilen in zwei Schleifen probiert, wie ich meinte?

Zu überlegen wäre übrigens auch, ob dein LModel auch ArrayAccess implementieren könnte. Den Getter und Delete hast du ja schon.
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:23  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Versuch es mal so:

Code:
abstract class LModel extends Model implements Countable, IteratorAggreate
{
    protected $intPointer     = 0;

    protected $arrObjectList  = array();

    public function getObjectByPointer($intPointer)
    {
        return ($this->arrObjectList[$intPointer]);
    }

    public function deleteObjectByPointer($intPointer)
    {
        unset($this->arrObjectList[$intPointer]);
    }

    public function getIterator()
    {
        return new ArrayIterator($this->arrObjectList);
    }


    public function count()
    {
        return (count($this->arrObjectList));
    }


    public function clearData()
    {
        $this->arrData = array();

        $this->arrObjectList = array();

        $this->rewind();
    }
}
dann sparst du dir den Iterator selbst zu implementieren und nutzt den nativen ArrayIterator, dank IteratorAggregate wird der auch automatisch bei foreach genutzt.

Ansonsten fällt mir gerade ein, kann es sein dass dein Iterator irgendwo stecken bleibt ?

Hast du mal ein rewind() versucht bevor du das 2te mal ein foreach nutzt ?
robo47 ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:29  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Wobei es dann schwieriger wird, den Iterator in Subklassen zu manipulieren. Evtl. soll deleteByPointer nicht möglich sein? In diesem Fall müsste man dann eine weitere Klasse für den speziellen Iterator schreiben, ob eine weitere Klasse dann besser oder schlechter wäre weiß ich allerdings nicht. Ich würde auf dem Model sowieso nicht schon in der Elternklasse direkten Zugriff auf die Felder zulassen.
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:29  
Erfahrener Benutzer
 
Registriert seit: 06.11.2008
Beiträge: 212
stayInside befindet sich auf einem aufstrebenden Ast
Standard

Also das mit dem Iterator lass ich erstmal so, da muss irgendwie noch ein wenig mehr geändert werden.

In 2 Schleifen klappt es nicht. Auch ein rewind() brachte nichts.

Allerdings ist mir aufgefallen das wenn ich die letzten beiden Einträge lösche es funktioniert. Wenn aber der Fall eintritt das die ersten 8 Einträge gelöscht werden, geht nichts mehr -.-
stayInside ist offline   Mit Zitat antworten
Alt 29.11.2009, 03:39  
Erfahrener Benutzer
 
Registriert seit: 06.11.2008
Beiträge: 212
stayInside befindet sich auf einem aufstrebenden Ast
Standard

Ich habs -.-

Habe mein LModel neu aufgebaut. Einfach eine 1:1 Kopie von php.net, nun sind alle Fehler weg -.- Da habe ich wohl irgendwo nen Fehler gehabt.
stayInside ist offline   Mit Zitat antworten
Alt 29.11.2009, 13:58  
erc
Erfahrener Benutzer
 
Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse:
Fortgeschritten
erc wird schon bald berühmt werden
Standard

Dein Problem liegt/lag bei:
PHP-Code:
public function next() {
        
$this->intPointer++;

Ein Array in PHP ist immer ein associativer Array. Wenn du Elemente löschst dann beeinflusst das nicht die Keys der anderen Elemente.

Beipiel:

PHP-Code:
$test = array(1,2,3,4,5);
//0=>1, 1=>2, 2=>3...
unset($test[1]); 
//0=>1, 2=>3... 
Klar wo das Problem ist?
erc ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Von einem Objekt auf ein anders Objekt zugreifen Xenon54 PHP Tipps 2009 12 16.10.2009 16:21
Objekt löschen via Methodenübergabe desselben nikosch Software-Design 19 01.06.2009 00:38
[Erledigt] Objekt an Konstruktor übergeben hawkeye78 PHP Tipps 2009 7 28.02.2009 19:01
Wireshark SSL Handshake debugging-Handshake protokoll mittels PHP + Curl brian johnson Off-Topic Diskussionen 0 06.11.2008 11:54
Objekt aufrufen nixdorf PHP Tipps 2008 9 10.10.2008 18:29
Objekt im GET-Query wird nicht übertragen Ralpho PHP-Fortgeschrittene 10 05.05.2008 10:03
Objekt als ComboBox behandeln Nalincah PHP Tipps 2008 2 08.11.2007 03:52
Klassensammlung über ein Objekt zur Verfügung stellen ecomeback PHP Tipps 2007 7 14.07.2007 00:01
PHP-Object (klasseninstanz) als Objekt an WS übergeben. joni1980 PHP-Fortgeschrittene 2 10.05.2006 11:25
Zugriff auf verschachteltes Objekt aus Funktion FloMX PHP-Fortgeschrittene 10 28.03.2006 17:01
[Erledigt] PHP5 OOP Zugriff aus einem Objekt auf ein externes Objekt PHP Tipps 2006 5 28.01.2006 16:05
Objekt übergeben Fatal Error PHP Tipps 2007 5 28.12.2005 14:43
kann sich ein Objekt selbst serialisieren? ajo_silent PHP Tipps 2005-2 24 27.06.2005 09:13
[Klassen] Untereintrag für Objekt erzeugen? DannyD PHP Tipps 2005 5 17.02.2005 18:13
Objekt in einer Session suter PHP Tipps 2004-2 2 13.12.2004 17:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
javascript iterate object, iteration php, daraus ergeben sich drei löschmethoden, php iteration, php objekt aus array entfernen, iterator interface php element entfernen, php objekte durchlaufen, php iterate object, löschmethode, php daten aus objekt entfernen, php element aus object entfernen, php object eintrag löschen, durch dropdown iterieren und einträge löschen js, php object iteration foreach example, iteration objekte löschen, iteration von objekten mit foreach, php list array, objekt liste entfernen iterat, php item aus arrayiterator entfernen, iterator löscht

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:20 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum