Donnerstag, 13. März 2008

PHP

Kaputtes numerisches Array in PHP reparieren

Ein nicht fortlaufendes, nummerisches Array kann zu Problemen führen. Aber es gibt ein Mittel dagegen.

Unter Umständen kann es vorkommen, dass man ein kaputtes, numerisches Array hat. Kaputt deshalb, weil die Indizies nicht fortlaufend sind. Das kann insbesondere kritisch werden, wenn man über einen Schleifenzähler darauf zugreift.

Eine kleines Beispiel um das Ganze zu verdeutlichen:

Download Code!

  1.  
  2. // Kaputtes Array erzeugen
  3. $foo = array();
  4. $foo[0] = 'bar';
  5. $foo[1] = 'foobar';
  6. $foo[3] = 'foofoo';
  7. // Ausgabe zum test
  8. print_r($foo);
  9. // Schleife, welche auf das Array zugreift
  10. // Erzeugt eine Warnung mit: Undefined offset:  2
  11. for($i = 0, $size = count($foo); $i < $size; ++$i) {
  12.         echo $foo[$i]."\n";
  13. }
  14.  
Ausgabe:
Array
(
    [0] => bar
    [1] => foobar
    [3] => foofoo
)
bar
Undefined offset:  2
foobar

Fehlerhafte numerische Arrays erzeugen Probleme

In Java würde man eine ArrayOutOfBoundsExpcetion bekommen, diese wenn nicht abgefangen zum Programmabbruch führt. PHP ist da zwar tolleranter, doch ist eine Warnung "prinzipiell" auch ein Fehler - bei sauberer Programmierweise.

Auch gibt es bestimmt Situationen mit dem Dateisystem, oder einer Datenbank, wo solche Warnungen schnell zu grossen Problem führen können.

Array reparieren - array_values ist dein Freund

Um das Array wieder zu reparieren, kann man die Funktion array_values verwenden. Diese stellt das Array wieder mit korrektem numerischen Indizies her.

Download Code!

  1.  
  2. print_r($foo);
  3. $foo = array_values($foo);
  4. print_r($foo);
  5.  
Ausgabe:
Array
(
    [0] => bar
    [1] => foobar
    [3] => foofoo
)
Array
(
    [0] => bar
    [1] => foobar
    [2] => foofoo
)
Bewertung: 5 von 5, 2 Stimme(n) 1135 Klicks
PHP
Von Mr.Foo in PHP am 13.03.08@17:06 Uhr

Verwandte Links:

  • 100 Tips und Tricks in PHP

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

4 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Dominic Markowski - #1 - 22.04.2008 08:07 - (Antwort)

Ich glaube Arrays "immer" zu reparieren kostet zu viel Laufzeit. Bei kleinen Arrays mag das als gute Idee in Frage kommen, bei größeren Arrays jedoch nicht.
Allgemein würde ich nie die Prüfung auf Kkorrektheit bzw. Existenz vernachlässigen. Zudem verleitet ein derartiger Aufbau dazu, Imperativ zu programmieren...

Gruß

Dominic

Mr. Foo - #1.1 - 22.04.2008 20:51 - (Antwort)

Der Gedanke eine Prüfung durchzuführen ist ansich nicht schlecht, was ich persönlich aber nur bei Arrays machen würde, die ich nicht "selbst" erzeugt habe.

Ansonsten wird der erzeugte Overhead zu groß, außerdem ging es ja nicht darum das Array immer zu reparieren, sondern nur dann wenn es definitiv auch notwendig ist.

Robert Römer - #2 - 20.10.2008 17:42 - (Antwort)

Was spricht eigentlich dagegen anstatt einer FOR-Schleife eine FOREACH-Schleife zu verwenden?

Zum einen ist es hier egal ob es nun ein Numerischer Schlüssel oder doch ein String ist und zum anderen interessieren hier Sprünge bei numerischen Schlüsseln nicht.

foreach( $array AS $key => $value ) {
/ do something /
}

oder

foreach( $array AS $value ) {
/ do something /
}

Tobias - #3 - 02.12.2010 22:28 - (Antwort)

Ansonst kann auch array_merge($array) verwendet werden.


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

Kaputtes numerisches Array in PHP reparieren

  • Homepage

Suche

Kategorien

  • Android (2)
  • C-Sharp (4)
  • Datenbank (30)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (16)
  • Internet (88)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (102)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (130)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (60)
  • Sonstiges (47)
  • Own Stuff (48)
  • Spass (46)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (17)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Mai 2012
  • April 2012
  • März 2012
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Sicherheit Software Sonstiges Spass Tipp Update Windows

Beliebte Einträge

  • Magento ist scheisse (197)
  • Plugin-container.exe deaktivieren (107)
  • BWin Betrug und Abzocke bei Minigames? (65)
  • C compiler cannot create executables unter Debian (53)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (43)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (28)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (28)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

Hugo zu BWin Betrug und Abzocke bei Minigames?
So, 20.05.2012 12:25
ich habe mich gestern auf BWIN reg [...]
Ubuntu 12.04 zu The assembly mscorlib.dll was not found or could not be loaded.
Fr, 18.05.2012 17:11
Hat bei mir leider nicht geklappt. [...]
Oliver Riske zu Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden
Di, 15.05.2012 20:38
Super Danke!
anon zu BWin Betrug und Abzocke bei Minigames?
Sa, 05.05.2012 18:43
ihr scheiss betrüger
Jürgen zu Unable to elevate error:1814 VLC Problem
Mi, 02.05.2012 16:54
So einfach ist es bei mir jedenfal [...]
 

Kontakt/Informationen