PHP foreach-Schleife in einer for-Schleife?

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

mal schauen, ob gerade noch einer wach ist...

Ich habe eine foreach-Schleife, die ich in einer for-Schleife ausführen möchte - etwa so:

PHP:
$stmt = $account->runQuery("SELECT * FROM buchung");
$stmt->execute();

for ($i = 10; $i >= 1; $i--) {

	foreach($stmt as $row) {
		echo $row['id'];
	}

}

In der foreach-Schleife befinden sich sagen wir mal 5 Datensätze.
Wen ich das Script ausführe, werden diese 5 Datensätze ausgegeben.
Da ich aber eine for-Schleife zuvor geschaltet habe, die 10 mal läuft,
müsste ich die 5 Datensätze doch 10 mal erhalten - oder nicht?

Es funktioniert nämlich nicht. Was stimmt da nicht?

VG, David
 
folgendes funktioniert bei mir:

PHP:
$colors = array("red", "green", "blue", "yellow"); 

for ($i = 0; $i < 10; $i++) {
   echo "$i<br>";
   foreach ($colors as $value) {
      echo "$value <br>";
   }
   echo "<br>";
}

Der Fehler liegt also irgendwo(?!) anders.
 
Was bekommst du denn als Ausgabe?
 
Ich bekomme alles, was sich in der foreach-Schleife befindet als Ausgabe.
Also alle id´s der vorhandenen Datensätze bekomme ich ausgegeben.
Wenn ich das in einer for-Schleife mache, aber dennoch nur ein mal.

Kann es mit der SQL-Anweisung zusammenhängen?

Hab das Beispiel von bagbag mal genommen, mit der SQL-Query,
dann hat es wieder nur einmal den foreach-Inhalt ausgegeben.

Also die foreach-Schleife wird nur beim ersten Durchlauf der for-Schleife ausgegeben.
Dann wird die for-Schleife zwar weiterhin durchlaufen, aber die Inhalte der foreach-
Schleife werden nicht mehr mit in das Ergebnis einbezogen.

Ausgabe:
10
id 1
id 2
id 3
id 4
id 5
9
8
7
6
5
4
3
2
1
 
Zuletzt bearbeitet:
Ich mache nichts mit PHP, daher nur eine Vermutung:

$stmt scheint kein Array zu sein, sondern ein Instanz von etwas. Wenn du nun mit ['id'] drauf zugreifst, macht die Instanz irgendetwas, sodass das Element danach nicht mehr vorhanden ist (gibt's da sowas wie array.length?).

Was du wohl machen könntest: Die Elemente vorher in ein Array kopieren und dann das Array 10 mal ausgeben. Oder einmal einen string erstellen (anstatt das Array) und dann den string 10 mal ausgeben - sollte performanter sein.
 
Bagbag schrieb:
Ich mache nichts mit PHP, daher nur eine Vermutung:

$stmt scheint kein Array zu sein, sondern ein Instanz von etwas. Wenn du nun mit ['id'] drauf zugreifst,
macht die Instanz irgendetwas, sodass das Element danach nicht mehr vorhanden ist (gibt's da sowas
wie array.length?).

Das kann gut sein.
Wie kopiere ich denn die Ergebnisse in ein Array?
Ich möchte von jedem Datendatz neben der ID auch
ein paar andere Werte ausgeben, anschließend.
 
ich bin müde und PHP ist schon länger her aber mit fetchAll() bekommst du die Datensätze als assoziatives Array
Code:
$stmt = $account->runQuery("SELECT * FROM buchung");
$stmt->execute();
$result = $stmt->fetchAll();
 
for ($i = 10; $i >= 1; $i--) {
 
	foreach($result as $row) {
		echo $row['id'];
	}
 
}
 
Wie ein Array in seiner Sprache funktioniert, sollte man eigentlich wissen.

Aber da ich heute gut drauf bin, habe ich trotzdem für dich gegoogelt und https://www.php-einfach.de/php-tutorial/php-array/ gefunden.

Aber wenn du wirklich programmieren können willst, gehört es dazu, so einfache Fragen (mit Google) selbst lösen zu können.


PHP:
$stmt = $account->runQuery("SELECT * FROM buchung");
$stmt->execute();

$rows = array();
foreach($stmt as $row) {
   $rows[] = $row['id'];
}
 
for ($i = 0; $i < 10; $i++) {
 
	foreach($rows as $row) {
		echo $row;
	}

 }


Warum gehst du die for-Schleifen eigentlich von oben nach unten durch (i = 10; i >= 1; i--)?
 
Sehr geil! Vielen Dank, so funktioniert es!
Mit Arrays kenn ich mich schon aus, aber in Kombination
mit PDO leider nicht. Aber ihr habt mir sehr geholfen!


Warum gehst du die for-Schleifen eigentlich von oben nach unten durch (i = 10; i >= 1; i--)?
Das hat was mit Kalendereinträge zu tun.
Die neusten zuerst, dann die alten.
 
Du könntest natürlich im SQL auch einfach richtig sortieren (ORDER BY), dann musst du die Schleife nicht von oben nach unten zählen lassen, was etwas unintuitiv ist..
 
der vollstaendigkeit halber: mit execute() erhaeltst du lediglich einen cursor (sowas wie handle/pointer) auf die result-menge, ueber die du dann im urspruenglichen code iterierst:
PHP:
foreach($stmt as $row) {
da $stmt hier sowas wie ein iterator ist, wirst du lediglich einmal ueber die menge der ergebnisse geschickt und die folgenden aeusseren for-iterationen lassen die innere foreach-schleife ergebnislos (da nach der ersten kompletten durchiteration der menge keine weiteren elemente verbleiben).

das ist eine effiziente loesung des iterierens, bei dem nicht alle elemente gleichzeitig im speicher sein muessen, was du fuer deinen use case brauchst. fetchAll() macht das.
 
Zurück
Oben