foreach Problem
compu
- php
Guten Tag,
folgender Code:
$array = array();
$dent = array();
while ($row = mysql_fetch_array($result)) {
$i = 0;
array_push($dent, '!artikelnummer!', '!referenz!',/* etc */);
array_push($array, $dent);
}
$xml->push('artikel', array('transaction' => 'reinit'));
// Tags
foreach($array as $value) {
$xml->push('artiksatz');
$xml->element('artikelnummer', $value[++$i]);
$xml->push('artikelstamm', $value[++$i]);
$xml->element('artikelmehrfachauswahl', $value[++$i]);
// etc
}
Warum kommt hier immer die Fehlermeldung "Invalid argument supplied for foreach()" ?
Danke
Hello,
Warum kommt hier immer die Fehlermeldung "Invalid argument supplied for foreach()" ?
Lass Dir mal den Datentyp anzeigen, der entsteht, wenn Du
$_feld = array();
array_push($feld,false);
durchgeführt hast.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
Lass Dir mal den Datentyp anzeigen, der entsteht, wenn Du
$_feld = array();
array_push($feld,false);
Das sollte ein Array von Arrays sein.
Hello,
Hallo,
Lass Dir mal den Datentyp anzeigen, der entsteht, wenn Du
$_feld = array();
array_push($_feld,false);
echo "<b />Typ des Feldes ist ".gettype($_feld);
Das sollte ein Array von Arrays sein.
Der Typ bleibt auch Array(), zumindest mit meiner PHP-Version. Es gab da aber mal einen Fehler. Welche Version verwendest Du?
Dann musst Du eben
if (isarray(...))
foreach( )
{
}
den Fehler abfangen.
Grüße aus http://www.braunschweig.de
Tom
Hallo,
also ich verwende immer die aktuellste stabile Version.
Habe mit gettype die vars abgefragt.Beide sind vom Typ array, wie gewollt.
Die Fehlermeldung: "Invalid argument supplied for foreach()" kommt immernoch.
Compu
Hello,
Die Fehlermeldung: "Invalid argument supplied for foreach()" kommt immernoch.
dann solltest Du dir vielleicht mal abgewöhnen, eigentlich reservierte Wörter (array) als Variablennamen zu verwenden. Das ist die einzige Idee, die ich nun noch habe dazu.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Tom,
dann solltest Du dir vielleicht mal abgewöhnen, eigentlich reservierte Wörter (array) als Variablennamen zu verwenden. Das ist die einzige Idee, die ich nun noch habe dazu.
Das habe ich alles schon ausprobiert. Nix hat geholfen.
Bin am verzweifeln.
mach mal vor dem foreach eine echo count($array).
ich denke mal, daß dort 0 herauskommt.
OK, neue Variante. Klappt aber auch nicht:
// Werte
$i = 0;
while ($row = mysql_fetch_array($result)) {
$i++;
$arr = array('artikelnummer' => test,
'artikelmehrfachauswahl' => test,
'verpackungseinheit' => test,
'artikelbezeichnung' => test,
'artikelbezeichnung1' => test,
'artikelbeschreibung' => test,
'verpackungsinhalt' => test,
'herstellernummer' => test,
'herstellername' => test,
'artikelbild' => test,
'thumbnail' => test,
'status' => test,
'suchtext' => test,
'hilfsmittelnummer' => test,
'pharmazentralnummer' => test,
'adrnummer' => test,
'unnummer' => test,
'empfendverbrauchpreis' => test,
'de' => test,
'zolltarifnummer' => test,
'mwst' => test,
'leasing' => test,
'preis' => test,
'preisgruppenkz' => test,
'gueltigab' => test,
'waehrungskz' => test,
'verkaufsmenge' => test,
'preis' => test,
'Preisgruppenkz' => test,
'gueltigab' => test,
'waehrungsKZ' => test,
'verkaufsmenge' => test,
'preis' => test,
'preisgruppenkz' => test,
'gueltigab' => test,
'waehrungsKZ' => test,
'verkaufsmenge' => test,
'preis' => test,
'Preisgruppenkz' => test,
'gueltigab' => test,
'waehrungsKZ' => test,
'verkaufsmenge' => test,
'gruppennummer' => test,
'referenz' => test,
'bezeichnung' => test,
'art' => test,
'typ' => test,
'artikelnummerziel' => test);
$xml->push('artikel', array('transaction' => 'reinit'));
// Tags
foreach($arr as $a) {
$xml->push('artiksatz');
$xml->element('artikelnummer', $a);
$xml->push('artikelstamm', $a);
$xml->element('artikelmehrfachauswahl', $a);
$xml->element('verpackungseinheit', $a);
$xml->element('artikelbezeichnung2', $a);
$xml->element('artikelbezeichnung1', $a);
$xml->element('artikelbeschreibung', $a);
$xml->element('verpackungsinhalt', $a);
$xml->element('artikelzusatzangabe', $a);
$xml->element('herstellernummer', $a);
$xml->element('herstellername', $a);
$xml->element('artikelbild', $a);
$xml->element('thumbnail', $a);
$xml->element('status', $a);
$xml->element('suchtext', $a);
$xml->element('hilfsmittelnummer', $a);
$xml->element('pharmazentralnummer', $a);
$xml->element('adrnummer', $a);
$xml->element('unnummer', $a);
$xml->element('empfendverbrauchpreis', $a);
$xml->element('ursprungsland', $a);
$xml->element('zolltarifnummer', $a);
$xml->element('mwst', $a);
$xml->element('leasing', $a);
$xml->pop();
$xml->push('preise');
$xml->push('preissatz');
$xml->element('preis', $a);
$xml->element('Preisgruppenkz', $a);
$xml->element('gueltigab', $a);
$xml->element('waehrungsKZ', $a);
$xml->element('verkaufsmenge', $a);
$xml->pop(); // preissatz
$xml->push('preissatz');
$xml->element('preis', $a);
$xml->element('Preisgruppenkz', $a);
$xml->element('gueltigab', $a);
$xml->element('waehrungsKZ', $a);
$xml->element('verkaufsmenge', $a);
$xml->pop(); // preissatz
$xml->push('preissatz');
$xml->element('preis', $a);
$xml->element('Preisgruppenkz', $a);
$xml->element('gueltigab', $a);
$xml->element('waehrungsKZ', $a);
$xml->element('verkaufsmenge', $a);
$xml->pop(); // preissatz
$xml->push('preissatz');
$xml->element('preis', $a);
$xml->element('Preisgruppenkz', $a);
$xml->element('gueltigab', $a);
$xml->element('waehrungsKZ', $a);
$xml->element('verkaufsmenge', $a);
$xml->pop(); // preissatz
$xml->pop(); // preise
$xml->push('artikelgruppenzuordnungen');
$xml->element('gruppennummer', $a);
$xml->pop(); // artikelgruppenzuordnungen
$xml->push('medienverweise');
$xml->push('medienverweis');
$xml->element('referenz', $a);
$xml->element('bezeichnung', $a);
$xml->element('art', $a);
$xml->element('typ', $a);
$xml->pop(); // medienverweis
$xml->pop(); // medienverweise
$xml->push('artikelverweise');
$xml->push('artikelverweis', 'variante');
$xml->element('artikelnummerziel', $a);
$xml->pop(); // artikelverweis
$xml->pop(); // artikelverweise
}
}
$xml->pop();
echo $xml->getXml();
es geht nicht um variationen, sonder nur darum, das foreach ein array der länge 0 nicht iterieren kann.
wahrscheinlich liefert dein resultset nichts. daher wird das array nicht gefüllt.
setze doch zu testzwecken einfach mal direkt etwas in das array hinein, ohne datenbank. dann wird das foreach laufen.
Hello,
es geht nicht um variationen, sonder nur darum, das foreach ein array der länge 0 nicht iterieren kann.
wahrscheinlich liefert dein resultset nichts. daher wird das array nicht gefüllt.
setze doch zu testzwecken einfach mal direkt etwas in das array hinein, ohne datenbank. dann wird das foreach laufen.
foreach() kann auch mit Arrays der Länge 0 umgehen, zumindest bei PHP-Versionen ab 4.3.x
Alod nochmal gefragt:
Liebe Grüße aus http://www.braunschweig.de
Tom
Hello,
was passiert denn in der Klasse von $xml?
Wird das Array dort angefasst?
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi,
lasse deine Schleife nur dann durchlaufen wenn
is_array($array) == TRUE
z.B.
if (is_array($array)) {
foreach($array as $value) {
$xml->push('artiksatz');
$xml->element('artikelnummer', $value[++$i]);
$xml->push('artikelstamm', $value[++$i]);
$xml->element('artikelmehrfachauswahl', $value[++$i]);
// etc
} else {
// mache was Anderes oder gebe einen Fehler aus.
}
Bei mir (bin wie Du ebenfalls Amateur) hat sich diese Vorgehensweise, zumindest bis jetzt, ganz gut bewährt.
Grüsse
Frankie
Hallo,
lasse deine Schleife nur dann durchlaufen wenn
is_array($array) == TRUE
?? Was soll das denn bringen. $array ist doch als array definiert.
Deswegen wird das foreach immer ausgeführt werden.
Die Fehlermeldung lautet doch "Invalid argument supplied for foreach()".
hi,
?? Was soll das denn bringen. $array ist doch als array definiert.
Deswegen wird das foreach immer ausgeführt werden.
Ein Array ist nur dann auch "wirklich" ein Array, wenn auch Werte drinstehen.
Die Fehlermeldung lautet doch "Invalid argument supplied for foreach()".
Genau, und diese Fehlermeldung bekommst Du weil dein Array leer ist (keine Werte enthält) und damit foreach nicht ausgeführt werden kann.
Mir ist es eigentlich ziemlich wurscht ob Du meinen Ratschlag befolgst oder nicht, aber wenn Du es ausprobierts wirst Du sehen, dass es wie von mir vorgeschlagen funktioniert.
Grüsse
Frankie
Hallo,
Genau, und diese Fehlermeldung bekommst Du weil dein Array leer ist (keine Werte enthält) und damit foreach nicht ausgeführt werden kann.
Ja, ich verstehe was du meinst. Aber leider ist das Array nicht leer.
Schau mal hier. Das ist das komplette Skript. Die Ausgabe ist unten:
<?php require("xml.class.php");
$dbHost = "localhost"; $dbUser = "root"; $dbPassword = "test"; $dbName = "test";
mysql_connect($dbHost, $dbUser, $dbPassword) or $this->error("", mysql_error(), mysql_errno()); mysql_select_db($dbName);
$sql = "SELECT * FROM artikeldetails ad, bestellinfo bi, de_produktinfo de_pi, produktinfo pi, products_hyrachie ph, products p WHERE (ad.d_artikelnummer = bi.d_artikelnummer) AND (bi.product_id = de_pi.product_id) AND (pi.product_id = de_pi.product_id) AND (p.product_id = bi.product_id) AND (p.category = ph.cat_id)";
$result = mysql_query($sql); $xml = new XmlWriter();
// Werte $i = 0;
$outer = array();
while ($row = mysql_fetch_array($result)) { $inner = array(test, // 'artikelnummer' => test, // 'artikelmehrfachauswahl' => test, // 'verpackungseinheit' => test, // 'artikelbezeichnung' => test, // 'artikelbezeichnung1' => test, // 'artikelbeschreibung' => test, // 'verpackungsinhalt' => test, // 'herstellernummer' => test, // 'herstellername' => test, // 'artikelbild' => test, // 'thumbnail' => test, // 'status' => test, // 'suchtext' => test, // 'hilfsmittelnummer' => test, // 'pharmazentralnummer' => test, // 'adrnummer' => test, // 'unnummer' => test, // 'empfendverbrauchpreis' => test, // 'de' => test, // 'zolltarifnummer' => test, // 'mwst' => test, // 'leasing' => test, // 'preis' => test, // 'preisgruppenkz' => test, // 'gueltigab' => test, // 'waehrungskz' => test, // 'verkaufsmenge' => test, // 'preis' => test, // 'Preisgruppenkz' => test, // 'gueltigab' => test, // 'waehrungsKZ' => test, // 'verkaufsmenge' => test, // 'preis' => test, // 'preisgruppenkz' => test, // 'gueltigab' => test, // 'waehrungsKZ' => test, // 'verkaufsmenge' => test, // 'preis' => test, // 'Preisgruppenkz' => test, // 'gueltigab' => test, // 'waehrungsKZ' => test, // 'verkaufsmenge' => test, // 'preis' => test, // 'gruppennummer' => test, // 'referenz' => test, // 'bezeichnung' => test, // 'art' => test, // 'typ' => test); // 'artikelnummerziel' =>
array_push($outer, $inner); }
echo "<pre>"; print_r($outer); echo "</pre>";
$xml->push('artikel', array('transaction' => 'reinit'));
// Tags foreach($outer as $a) { $xml->push('artiksatz'); $xml->element('artikelnummer', $a[0]); $xml->push('artikelstamm', $a[++$i]); $xml->element('artikelmehrfachauswahl', $a[++$i]); $xml->element('verpackungseinheit', $a[++$i]); $xml->element('artikelbezeichnung2', $a[++$i]); $xml->element('artikelbezeichnung1', $a[++$i]); $xml->element('artikelbeschreibung', $a[++$i]); $xml->element('verpackungsinhalt', $a[++$i]); $xml->element('artikelzusatzangabe', $a[++$i]); $xml->element('herstellernummer', $a[++$i]); $xml->element('herstellername', $a[++$i]); $xml->element('artikelbild', $a[++$i]); $xml->element('thumbnail', $a[++$i]); $xml->element('status', $a[++$i]); $xml->element('suchtext', $a[++$i]); $xml->element('hilfsmittelnummer', $a[++$i]); $xml->element('pharmazentralnummer', $a[++$i]); $xml->element('adrnummer', $a[++$i]); $xml->element('unnummer', $a[++$i]); $xml->element('empfendverbrauchpreis', $a[++$i]); $xml->element('ursprungsland', $a[++$i]); $xml->element('zolltarifnummer', $a[++$i]); $xml->element('mwst', $a[++$i]); $xml->element('leasing', $a[++$i]); $xml->pop(); $xml->push('preise');
$xml->push('preissatz'); $xml->element('preis', $a[++$i]); $xml->element('Preisgruppenkz', $a[++$i]); $xml->element('gueltigab', $a[++$i]); $xml->element('waehrungsKZ', $a[++$i]); $xml->element('verkaufsmenge', $a[++$i]); $xml->pop(); // preissatz
$xml->push('preissatz'); $xml->element('preis', $a[++$i]); $xml->element('Preisgruppenkz', $a[++$i]); $xml->element('gueltigab', $a[++$i]); $xml->element('waehrungsKZ', $a[++$i]); $xml->element('verkaufsmenge', $a[++$i]); $xml->pop(); // preissatz
$xml->push('preissatz'); $xml->element('preis', $a[++$i]); $xml->element('Preisgruppenkz', $a[++$i]); $xml->element('gueltigab', $a[++$i]); $xml->element('waehrungsKZ', $a[++$i]); $xml->element('verkaufsmenge', $a[++$i]); $xml->pop(); // preissatz
$xml->push('preissatz'); $xml->element('preis', $a[++$i]); $xml->element('Preisgruppenkz', $a[++$i]); $xml->element('gueltigab', $a[++$i]); $xml->element('waehrungsKZ', $a[++$i]); $xml->element('verkaufsmenge', $a[++$i]); $xml->pop(); // preissatz $xml->pop(); // preise $xml->push('artikelgruppenzuordnungen'); $xml->element('gruppennummer', $a[++$i]); $xml->pop(); // artikelgruppenzuordnungen $xml->push('medienverweise'); $xml->push('medienverweis'); $xml->element('referenz', $a[++$i]); $xml->element('bezeichnung', $a[++$i]); $xml->element('art', $a[++$i]); $xml->element('typ', $a[++$i]); $xml->pop(); // medienverweis $xml->pop(); // medienverweise $xml->push('artikelverweise'); $xml->push('artikelverweis', 'variante'); $xml->element('artikelnummerziel', $a[++$i]); $xml->pop(); // artikelverweis $xml->pop(); // artikelverweise }
$xml->pop(); echo $xml->getXml(); ?>
Ausgabe:
Array ( [0] => Array ( [0] => test [1] => test [2] => test [3] => test [4] => test [5] => test [6] => test [7] => test [8] => test [9] => test [10] => test [11] => test [12] => test [13] => test [14] => test [15] => test [16] => test [17] => test [18] => test [19] => test [20] => test [21] => test [22] => test [23] => test [24] => test [25] => test [26] => test [27] => test [28] => test [29] => test [30] => test [31] => test [32] => test [33] => test [34] => test [35] => test [36] => test [37] => test [38] => test [39] => test [40] => test [41] => test [42] => test [43] => test [44] => test [45] => test [46] => test [47] => test [48] => test )
[1] => Array ( [0] => test [1] => test [2] => test [3] => test [4] => test // etc ... bis 193
Un dann kommen die ganzen Fehlermeldungen:
Warning: Invalid argument supplied for foreach() in ... Warning: Invalid argument supplied for foreach() in ... Warning: Invalid argument supplied for foreach() in ... Warning: Invalid argument supplied for foreach() in ... Warning: Invalid argument supplied for foreach() in ... Warning: Invalid argument supplied for foreach() in ... etc,etc,etc
Hallo,
Ja, ich verstehe was du meinst. Aber leider ist das Array nicht leer.
Dann hat dein Fehler mit $xml zu tun. Hast Du die Klasse selbst geschrieben? Wenn ja, dann weißt Du ja was dort gemacht wird, und wenn nicht, dann versuche zu Verstehen was genau da gemacht wird.
Ich muss mich selbst korrigieren, foreach scheint doch mit leerem Array zu funktionieren, wusste ich bis jetzt auch nicht.
Bei mir geht folgendes z.B. ohne Probleme, müsste also auch bei dir funktionieren:
<?php
echo "<br>AUSGABE<br>";
echo "<br>==================================<br>";
$kein_array = "";
$i = 0;
foreach ($kein_array as $v) {
$i++;
echo $i." - ".$v."<br>";
}
echo "<br>==================================<br>";
$leer_array = array();
$i = 0;
foreach ($leer_array as $v) {
$i++;
echo $i." - ".$v."<br>";
}
echo "<br>==================================<br>";
$inner = array(
'artikelnummer',
'artikelmehrfachauswahl',
'verpackungseinheit',
'artikelbezeichnung',
'artikelbezeichnung1',
'artikelbeschreibung',
'verpackungsinhalt',
'herstellernummer',
'herstellername',
'ENDE',
// usw.
);
$i = 0;
foreach ($inner as $v) {
$i++;
echo $i." - ".$v."<br>";
}
?>
AUSGABE
==================================
Warning: Invalid argument supplied for foreach() in e:\www\root\test\gaestebuch\_test.php on line 19
==================================
==================================
1 - artikelnummer
2 - artikelmehrfachauswahl
3 - verpackungseinheit
4 - artikelbezeichnung
5 - artikelbezeichnung1
6 - artikelbeschreibung
7 - verpackungsinhalt
8 - herstellernummer
9 - herstellername
10 - ENDE
Grüsse
Frankie
Hello,
hi,
?? Was soll das denn bringen. $array ist doch als array definiert.
Deswegen wird das foreach immer ausgeführt werden.Ein Array ist nur dann auch "wirklich" ein Array, wenn auch Werte drinstehen.
Erstens sind Arrays in PHP gar meine Arrays, sondern verkettete Listen.
<img src="http://bitworks.de/~selfHTML/EinfachesArray500.gif" border="0" alt="">
und
<img src="http://bitworks.de/~selfHTML/VerzweigtesArray500.gif" border="0" alt="">
Ob da nun Elemente angekoppelt sind oder nicht, ändert am Typ nichts. Und wenn der Startzeiger gelich auf den Endepunkt zeigt und umgekehrt, dann sind eben keine Elemente da. Die Programmierer von PHP sind nicht blöd und haben diese einfachen Grenzerscheinungen selbstverständlich sauber geregelt. Also verbreite hier bitte kein ungesundes Viertelwissen.
In der klassichen Programmierung, in der ein Array ein geschlossener Speicherbereich ist, der mit wiederkehrenden Datenstrukturen gefüllte werden darf, ist es selbstverständlich auch möglich, dass in dem reservierten Bereich absolut keine gültigen Daten vorhanden sind.
Die Fehlermeldung lautet doch "Invalid argument supplied for foreach()".
Und genau aus diesem Grunde soll direkt VOR dem foreach() nochmals der Typ abgeprüft werden
if(is_array($_liste))
{
foreach($_liste als $zeile)
{
# tuWas
}
}
else
{
#Fehlermeldung
echo '<br> Typ von $_liste ist '.gettype($_liste);
exit;
}
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi,
Ja, genau das schrieb ich doch in meinem 1. Antwortposting, wenngleich auch nicht mit so schönen Bildchen untermalt.
Ich schrieb am 14. 04. 2004 um 18:00 :
<cite>
if (is_array($array)) {
foreach($array as $value) {
$xml->push('artiksatz');
$xml->element('artikelnummer', $value[++$i]);
$xml->push('artikelstamm', $value[++$i]);
$xml->element('artikelmehrfachauswahl', $value[++$i]);
// etc
} else {
// mache was Anderes oder gebe einen Fehler aus.
}
</cite>
Du schriebst am 15. 04. 2004 um 16:59:
if(is_array($_liste))
{
foreach($_liste als $zeile)
{
# tuWas
}
}
else
{
#Fehlermeldung
echo '<br> Typ von $_liste ist '.gettype($_liste);
exit;
}
Und wenn Du mir jetzt noch bitteschön erklärst was der grundlegende Unterschied zwischen beiden Codeschnipseln ist, dann bin ich auch weitergeholfen.
Grüsse
Frankie
<?php
require("xml.class.php");
$xml = new XmlWriter();
$array = array(
array('monkey', 'banana', 'Jim'),
array('hamster', 'apples', 'Kola'),
array('turtle', 'beans', 'Berty'),
);
$xml->push('zoo');
foreach ($array as $animal) {
$xml->push('animal', array('species' => $animal[0]));
$xml->element('name', $animal[2]);
$xml->element('food', $animal[1]);
$xml->pop();
}
$xml->pop();
echo $xml->getXml();
?>
Das ist das Beispielscript. Und das funktioniert doch auch!!
Komisch.