hilfdirselbst.ch
Facebook Twitter gamper-media
Tömsken
Beiträge: 720
23. Apr 2004, 12:30
Beitrag #1 von 4
Bewertung:
(1537 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

count()


Moin.

Ein "interessantes" Problem beschäftigt mich momentan. Ich habe also ein Formular mit Listbox...

<select name="books[]" size="10" multiple>
...
</select>

...dessen Inhalt ich auslesen möchte. Dazu gibt's 'ne Schleife:

if (count($books) > 0) {
for ($i = 0; $i < count($books); $i++) {
if (isset($books[$i])) {
// Buch sichern
}}}

Das funktioniert prima, so lange mind. ein Eintrag in der Listbox steht. Ist die jedoch leer, sollte IMHO $books ein Array mit "0" Einträgen sein. Aber count($books) liefert trotzdem "1".

Ok, dachte ich, sei pfiffig, live and let live, und prüfe per "isset($books[$i])", ob ich gerade angelogen werde. Das wird jedoch brutal quittiert mit "Warning: Uninitialized string offset: 0 in ...".

Nun könnte man natürlich das Error-Reporting toleranter einstellen. Möchte ich aber nicht, weil ich so stolz auf meinen ansonsten so "schulmäßigen" Code bin.

Hat also jemand 'ne Erklärung für count($books)== 1 und 'nen Tipp zum Umgehen der Warnung?

Tom Top
 
X
oesi50  A  S
Beiträge: 2315
23. Apr 2004, 17:16
Beitrag #2 von 4
Beitrag ID: #81588
Bewertung:
(1537 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

count()


hi Tömsken,

wie wärs denn mit:

foreach ($books as $value) {
echo "Wert: $value";
}

Das setzt natürlich voraus, dass Deine Bücher nicht positionsabhängig sind.

Grüße Oesi
Ich weiß, dass ich nichts weiß... (Sokrates)
als Antwort auf: [#81520]
(Dieser Beitrag wurde von oesi50 am 24. Apr 2004, 15:12 geändert)
Top
 
Miro Dietiker
Beiträge: 699
23. Apr 2004, 22:37
Beitrag #3 von 4
Beitrag ID: #81624
Bewertung:
(1537 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

count()


Dein Problem ist dass das Verhalten von Count nicht deinen
Vorstellungen entspricht:
DOKU: int count ( mixed var [, int mode])

Schau mal mit
print($books);
ob die Variable $books wirklich ein Array ist wenn nichts ausgewählt!
(Steht 'Array' als Ausgabe ist es einer, und count() sollte 0
zurückgeben.. Steht nichts oder etwas anderes, ist $books kein
array mehr und count() tut nicht das was du erwartest!)
Siehe DOKU:
If var is not an array, 1 will be returned (exception: count(NULL) equals 0).
http://ch2.php.net/...n/function.count.php

Abhilfe grundlegend:

if(is_array($books)) {
#DEIN CODE
}

Das grundlegende Problem hier ist die lose Typenbehandlung von
PHP, welche bei manchen funktionen auch etwas 'lose' gehandhabt wird!
Bsp f. Rückgabewerte (mysql_fetch_array):
Datenarray wenn erfolgreich, false im Fehlerfall, usw...

Hoffe du hast damit etwas mehr Bezug zur Problematik!

GrEeZ: Miro Dietiker
als Antwort auf: [#81520] Top
 
Tömsken
Beiträge: 720
27. Apr 2004, 20:00
Beitrag #4 von 4
Beitrag ID: #82298
Bewertung:
(1537 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

count()


Hi Miro!
Besten Dank für den guten Tipp!
is_array() ist die Lösung. Ich konnte es mir nicht vorstellen, aber offensichtlich ist es doch so, dass eine LEERE Listbox mit Mehrfach-Selektionsmöglichkeit KEIN Array zurückliefert ( - sondern scheinbar einen String). Erst wenn mind. ein Eintrag drin steht, wird auch ein Array übergeben.
als Antwort auf: [#81520] Top
 
X