Pour utiliser foreach
, vous devez disposer d'un tableau contenant toutes les lignes du résultat de la requête. Certaines bibliothèques DB pour PHP fournissent une fonction fetch_all
qui fournit un tableau approprié, mais je ne pouvais pas en trouver un pour mysql
(cependant, l'extension mysqli le fait). Vous pouvez bien sûr écrire le vôtre, comme si
function mysql_fetch_all($result) {
$rows = array();
while ($row = mysql_fetch_array($result)) {
$rows[] = $row;
}
return $rows;
}
Cependant, je dois faire écho au "pourquoi?" En utilisant cette fonction, vous créez deux boucles au lieu d'une, et vous devez charger tout le jeu de résultats dans la mémoire. Pour des ensembles de résultats suffisamment volumineux, cela peut devenir un sérieux frein à la performance. Et pour quoi?
foreach (mysql_fetch_all($result) as $row)
vs
while ($row = mysql_fetch_array($result))
while
est tout aussi concis et plus facile à lire l'OMI.
EDIT Il existe une autre option, mais elle est assez absurde. Vous pouvez utiliser le Iterator Interface
class MysqlResult implements Iterator {
private $rownum = 0;
private $numrows = 0;
private $result;
public function __construct($result) {
$this->result = $result;
$this->numrows = mysql_num_rows($result);
}
public function rewind() {
$this->rownum = 0;
}
public function current() {
mysql_data_seek($this->result, $this->rownum);
return mysql_fetch_array($this->result);
}
public function key() {
return $this->rownum;
}
public function next() {
$this->rownum++;
}
public function valid() {
return $this->rownum < $this->numrows ? true : false;
}
}
$rows = new MysqlResult(mysql_query($query_select));
foreach ($rows as $row) {
//code...
}
Dans ce cas, l'instance MysqlResult
va chercher des lignes seulement sur demande comme avec while
, mais il enveloppe dans un joli paquet foreach-mesure. Tandis que vous vous épargniez une boucle, vous avez ajouté le surcoût de l'instanciation de classe et une charge d'appels de fonction, sans parler de la complexité supplémentaire du code.
Mais vous avez demandé si cela pouvait être fait sans utiliser while
(ou for
j'imagine). Eh bien, peut être fait, juste comme ça.Que ce soit devrait être fait à vous.
Pourquoi? Je ne vois aucune raison de changer votre code. Utiliser un foreach ne fera que le faire plus longtemps et utiliser plus de mémoire. –
Eh bien, n'allez pas apprendre des choses qui vont aggraver votre code. Au lieu de cela, apprenez ceci: n'utilisez pas une boucle foreach avec mysql_fetch_array(). –