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:
Très bien. Ça marche nickel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 foreach ($dao->searchById(123) as $row) { echo $row['champ_1']; }
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:
Ça ça me bouffe des ressources
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $tablo = array(); foreach ($dao->searchComplexeQuery() as $row) { $tablo[] = $row; }
Comme j'ai un ArrayAccess, j'ai pensé faire directement un:
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part $tablo = $dao->searchComplexeQuery();
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.
Partager