Salut les gens,

J'ai un petit souci de perfs. J'ai un objet, qui me sert à parcourir un résultat de requête sql, il implémente ArrayAccess, Countable. Ainsi je peux faire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
foreach ($dao->searchById(123) as $row) {
   echo $row['champ_1'];
}
Très bien. Ça marche nickel.


Maintenant j'ai une requête sql un peu complexe qui me retourne un ensemble de tuples (tutu_id, toto_id). Sur un système en charge, j'ai 50000 tuples qui me sont retournés... J'ai besoin de tous ces tuples donc je ne peux faire de LIMIT pour réduire le nombre.

Là où j'ai un bottleneck, c'est que je mets ce résultât de recherche dans un tableau:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
$tablo = array();
foreach ($dao->searchComplexeQuery() as $row) {
   $tablo[] = $row;
}
Ça ça me bouffe des ressources

Comme j'ai un ArrayAccess, j'ai pensé faire directement un:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$tablo = $dao->searchComplexeQuery();
Mais plus tard dans mon script je fais, entre autres, un array_map sur mon $tablo pour extraire soit un tableau (tutu_id_1, tutu_id_2, ...) soit un tableau (toto_id_1, toto_id_2, ...). Et array_map n'apprécie pas que je lui passe un ArrayAccess, il veut un array tout court

Mon code actuel:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
$tablo = array();
foreach ($dao->searchComplexeQuery() as $row) {
   $tablo[] = $row;
}
//...
$tutus = array_map('extract_tutu', $tablo);
$totos = array_map('extract_toto', $tablo);

Questions:
- Y a-t-il une interface à implémenter dans la SPL qui me permettrait de balancer un objet à array_map ?
- Ou un toArray() qui me permettrait d'avoir un tableau nativement sans passer par une couche de foreach en PHP ?
- Ou une autre façon d'écrire mon code ?

Merci.

PS: je suis en PHP 5.1.6 mais suis curieux de connaitre si il y a une solution miracle en 5.2 ou 5.3.