trier un array ?? troll en cours ... - PHP - Programmation
Marsh Posté le 15-09-2008 à 09:10:34
ReplyMarsh Posté le 15-09-2008 à 09:12:58
c'est sur que c'est tellement mieux de charger ca dans un fichier a plat que de profiter de la puissance d'une base de données
tu sais que la session est stockée coté serveur, dans bête fichier texte ?
si vraiment tu as un pb de ressource , tu installe un cache mémoire pour les requêtes les plus courantes, la session ne doit etre utilisée que pour les données associé a l'utilisateur
Marsh Posté le 15-09-2008 à 13:10:13
KangOl a écrit : donc en gros, tu charges toute ta base de donnée en mémoire... |
Bien sur j'ai une base d'environ 30 tables, et ce tableau stocke le résultat d'une requête sur 2 tables ! (Et en nombre de lignes on est à environ 3000)
C'est bien la totalité de la base que je stocke dans ce tableau !
Merci à toi d'avoir essayer de répondre à la question, plutôt que de faire des remarques hors sujet !
Marsh Posté le 15-09-2008 à 13:18:46
flo850 a écrit : c'est sur que c'est tellement mieux de charger ca dans un fichier a plat que de profiter de la puissance d'une base de données |
Merci de ta réponse.
Côté "Best Practice" tu es presque aussi bon que ton collègue le kangourou ! Pour les tris tu ne vaut pas une cacahouète !
Au fait tu sais dans quoi sont stocké les données d'une base de données ... dans bête fichier !
Et si tu avais été un temps sois peu "curieux" tu aurais pu peut-être me demander pourquoi je stocke dans une SESSION, peut-être que ce n'est pas que pour l'accès BDD.
Mais dans ce cas on est complètement HORS SUJET !
Je pose une question concernant le PHP, et voilà que les seules réponses, concernent les bases de données ou SESSION , alors messieurs je pense que vous devriez "trainer" plutôt du côté Mysql, ou même Apache, et arrêter de venir polluer de vos réponses inutiles mon post !
J'attends avec impatience, vos gargarisations qui vont me donner des leçons, etc en me traitant très certainement comme le dernier des newbies, ou pire comme un abruti, mais c'est pas grave ... j'aurais tiré le premier ...
Pan t'es mort !
Marsh Posté le 15-09-2008 à 14:08:41
La réponse "php" :
array_sort, array_multisort, etc.
Y a tout ce qu'il te faut là : http://fr.php.net/manual/fr/ref.array.php
Après pour ton "distinct", y a ptêtre array_unique qui peut le faire. Jamais testé personnelement.
Par contre tu vas en manger des boucles pour faire tout ce que savent faire si bien les SGBD... Ce qui m'amène à une transition parfaite : pour ton attitude hautaine et ta non remise en question de ta conception, on ne peut rien faire de plus.
Marsh Posté le 15-09-2008 à 14:16:30
vu que c'est offert par la maison, j'en profite : tu es le dernier des newbie. Car seul le derniers des newbie aurai posé une question sur ce sujet plutôt que de regarder du cote des fonctions de tri de tableau, comme usort , ou comme array_unique. Au passage, je ne te traiterai pas d'abruti, j'ai moi aussi commencé a programmer un jour , et j'ai moi aussi poser des question cons
les bases de données sont des fichiers, c'est bien que tu sache ça
par contre, tu sais surement , dans ta grande connaissance du monde que les structure de données utilisées dans une base de données (arbres binaire equilibrés / arbres rouge et noir / ... ) garantissent un accès à un élément en o(log (n) ) , contrairement a une session qui est stockée de manière bcp plus simple
a plus forte raison, une base de données, bien paramétrée au niveau du cache ET ayant les bons index sera toujours plus rapide que de dupliquer les données en session.
A noter que pour les requêtes qui sont toujours trop couteuses , l'utilisation de apc_cache est vraiment plus efficace
Je ne parle même pas des problèmes de mise a jour que tu dois gérer à la main
merci de ne pas me prendre pour un abruti , ça a tendance a m'agacer [
Marsh Posté le 15-09-2008 à 14:22:26
Pourquoi en vouloir à KangOl ? Il est surtout très étonné que tu t'amuses à stocker dans une session la totalité de deux tables. Et comme de fait, ta session est soit stockée en base de données, ou simplement dans un fichier temporaire de ton système. -> Tu fais quand même le même boulot que le SGBDR !
Marsh Posté le 15-09-2008 à 14:22:33
kicest a écrit :
|
*/ base de donnée == fichier
*/ session == fichier
=> base de donnée == session
un peu simpliste tu trouves pas ?
Marsh Posté le 15-09-2008 à 14:23:54
flo850 a écrit : a plus forte raison, une base de données, bien paramétrée au niveau du cache ET ayant les bons index sera toujours plus rapide que de dupliquer les données en session. |
huhu.
Marsh Posté le 15-09-2008 à 14:25:05
on parle d'y stocker 3 K enregistrement et dy faire des tris , pas de stocker la fiche d'un utilisateur
Marsh Posté le 15-09-2008 à 14:27:28
flo850 a écrit : on parle d'y stocker 3 K enregistrement et dy faire des tris , pas de stocker la fiche d'un utilisateur |
oui, bon, ok, peut-être.
Si tu n'as pas la malchance d'avoir la base sur une autre machine, passablement over-surchargée.
Marsh Posté le 15-09-2008 à 14:29:38
Bon, et sinon, je confirme tout ce qui a été dit, que ce soit les fonctions de sort intégrées à php qui font ça très bien ou l'absurdité probable de la façon de faire.
Marsh Posté le 15-09-2008 à 15:13:15
Je valide ce topic:
Marsh Posté le 15-09-2008 à 15:42:45
flo850 a écrit : vu que c'est offert par la maison, j'en profite : tu es le dernier des newbie. Car seul le derniers des newbie aurai posé une question sur ce sujet plutôt que de regarder du cote des fonctions de tri de tableau, comme usort , ou comme array_unique. Au passage, je ne te traiterai pas d'abruti, j'ai moi aussi commencé a programmer un jour , et j'ai moi aussi poser des question cons |
Trop fort .. 1 post et j'en suis presque déjà à un troll !!!!!
Je ne te prends pas pour un abruti, mais peut-être pour quelqu'un qui pense que tout le monde devrait "tunner" sa base de données, avoir des compétences de DBA Séniors, et tout faire depuis le SGBD, c'est tellement plus simple !
ne t'inquiète pas je "pense" savoir positionner les bons index, clés primaires, forreign_keys, ...
oui j'ai consulté les fonction array php ... et ne suis jamais parvenu à obtenir le résultat que je voulais, que veux-tu tout le monde n'est pas ingénieur informatique, et j'ai très certainement du loupé et très certainement mal compris les syntaxes et utilisation de ces fonctions.
moi aussi lorsque l'on me demande de l'aide et que la personne n'a pas fait l'effort de chercher, je lui réponds souvent RTFM !!! Mais si je m'aperçois que la personne a essayé et n'y est pas arrivé, je lui réponds.
Réponse stricte : Voilà la solution à ta question
et je complète en informant que ce n'est peut-être pas la bonne méthode ... Mais pas l'inverse, peut-être que la personne a des problématiques, ou contraintes qui l'oblige à utiliser cette méthode, je ne suis pas dieu ni devin et ne vais pas préjuger du bien ou mal fondé de sa méthode !
Si les tris d'array permettent par exemple par usort d'exécuter une fonction utilisateur, je ne vais pas mettre en oeuvre un tri à bulle (à la con et couteux), aussi récusrsif soit-il, alors qu'il existe peut-être des personnes ayant rencontrés le même besoin, et ayant réussit par la combinaison de 2 ou 3 fonctions array à obtenir le résultat escompté, vu que personnellement ma grande "bêtise" ne me la pas permis !
Maintenant lorsque je crée un formulaire ou l'utilisateur peut mettre à jour des valeurs stockés dans différentes tables et cela sur pas mal de lignes en même temps, je préfère parser mon tableau de valeurs à la recherche des valeurs ayant été modifiés, exercer des contrôles et mettre à jour les rows modifiés, plutôt que faire de l'update global ! Je dis update car dans mon cas c'est de la mise à jour sans insertion possible, sinon j'aurais utiliser replace ! Un bon DBA me dirait ...oulala les données dans la SESSION sont peut-être trop "vieilles" et ne garantisse pas qu'elles soient, dans le cas d'accès multiples au même ligne, toujours au mêmes valeurs, ou alors il faut faire à la mode oracle, du select for update, ou gérer des transactions ... Mais moi mon problème c'est le tri de tableau en PHP !
Alors oui bien sur je pourrais faire des procédures stockés ou triggers, mais mon projet n'a pas besoin de tous ces processus ...
Par contre je suis bien aise de m'apercevoir que pour une fois tu respectes mon dernier message, ou j'étais persuadé qu'on allait me traiter de newbies, c'est la première ligne de ton message, bravo tu progresses ! (Ca c'est juste pour t'agacer un peu, tu as l'air de partir au quart de tour !)
Allez au plaisir de te lire rapidement flo850
Marsh Posté le 15-09-2008 à 15:45:58
PunkRod a écrit : La réponse "php" : |
Tu peux illustrer avec mes exemples, j'ai déjà regarder ces fonctions et jamais réussi a produire les bons résultats, ce qui m'amène à une transition parfaite : pour ton attitude hautaine et ta seule capacité à fournir un lien internet, on ne peut rien faire de plus
1 - 1
Marsh Posté le 15-09-2008 à 15:50:30
tiens, un paté.
Si tu as besoin de trier des données qui sont déjà dans ta session, plusieurs options :
Dernière question, toute bête - qu'apporte le fait d'utiliser la session pour stocker tout ce bordel? Tu penses vraiment y gagner quelque chose?
Marsh Posté le 15-09-2008 à 15:52:46
kicest a écrit : Tu peux illustrer avec mes exemples, j'ai déjà regarder ces fonctions et jamais réussi a produire les bons résultats, |
usort fait ce que tu veux - un tri en fonction de critères que tu détermines toi même via une fonction de comparaison. Si tu n'y arrives pas avec ça, montre ce que tu as essayé, le résultat obtenu, et explique ce que tu ne comprends pas.
Marsh Posté le 15-09-2008 à 15:55:10
et sinon, répondre a la question , c'est aussi prévenir les gens qu'ils font une connerie, surtout quand il n'est même pas possible de se marrer en le voyant se casser la gueule
et stocker trop de données en session est une connerie . Au mieux , ça ira moins vite qu'une base de données , au pire tu vas planter ton serveur en bouffant tout l'espace disque.
je vais essayer de trouver une image pour que tu essaye de comprendre que ça ne sert a rien de t'en prendre a moi si tu as une idée a chier : tu es en trazin de me demander le meilleure moyen de nouer du fil de pêche pour faire du saut à l'élastique ==> ça semble peut être jouable a échelle réduite, mais en grandeur réelle, il va y avoir des bouts de viandes partout
edit : et sinon, j'ai parlé d'usort et d'array_unique des le debut , tu n'as meme aps lu
Marsh Posté le 15-09-2008 à 15:55:27
kicest a écrit : |
dire "j'ai cherché" ne suffit pas pour empecher qu'on te file juste les lien vers la doc officielle.
citer le nom des fonctions que tu as utilisé sans succès aurait été le minimum
voire même un bout de code...
Marsh Posté le 15-09-2008 à 15:55:51
Un forum est un lieu privilégié d'échange et de communication
On souhaite t'aider mais on aimerait en contrepartie comprendre tes besoins / ta solution pour notre propre culture.
Marsh Posté le 15-09-2008 à 15:58:18
kicest a écrit : Tu peux illustrer avec mes exemples, j'ai déjà regarder ces fonctions et jamais réussi a produire les bons résultats, ce qui m'amène à une transition parfaite : pour ton attitude hautaine et ta seule capacité à fournir un lien internet, on ne peut rien faire de plus |
En fait, t'es surtout trop con pour avoir réussi à t'en servir
Marsh Posté le 15-09-2008 à 15:59:43
kicest a écrit : oui j'ai consulté les fonction array php ... et ne suis jamais parvenu à obtenir le résultat que je voulais, que veux-tu tout le monde n'est pas ingénieur informatique, et j'ai très certainement du loupé et très certainement mal compris les syntaxes et utilisation de ces fonctions. |
Code :
|
Regarde le code, teste le, comprend le et ensuite adapte le.
PS : Et dans quelques mois, années, tu jéteras surement ta solution à la poubelle après avoir vu le nombre de fois par jours où le serveur se sera bloqué à cause de problèmes de mémoire vive et/ou d'espace disque saturé.
Marsh Posté le 15-09-2008 à 16:00:43
Lui mâche pas le travail il va partir sans nous expliquer son binz.
Marsh Posté le 15-09-2008 à 16:03:25
KangOl a écrit : |
Vrai pour le stockage physique !
Je n'utilise ni JS ni autre fonction, que celle offerte par le HTML et PHP ! Certes je suis tout comme toi persuadé que le moteur SGBD est bien plus puissant et rapide que PHP dans le tri de données quand celles-ci proviennent d'une base de données.
Mais lorsque dans un formulaire j'ai 3000 lignes, et que l'utilisateur modifie 20 lignes de ces 3000, ne voulant pas (principe chez moi) faire un update massif sans contrôle et vérification de mes données, vaut-il mieux intérroger 3000 fois la base de données pour savoir quelles sont les 20 lignes à mettre à jour, ou parser un tableau pour ne retenir que les 20 lignes à mettre à jour et pratiquer à la mise à jour ?
Convient que l'on est loin de la simple problématique de tri de tableau en PHP, et je suis ouvert à vos remarques, suggestions et pourquoi pas "volée de bois verts" concernant ma méthode , et suis prêt à remettre en question ma conception, mais sur le tri de tableau ... avons nous eu un élément de réponse ?
Marsh Posté le 15-09-2008 à 16:07:47
kicest a écrit :
|
Un update massif sera plus rapide et moins couteux en temps de développement. Il n'y a pas de raison rationnelle à batailler en php pour ça.
C'est le boulot du sgbd de déterminer s'il a vraiment quelque chose à faire, et il bien plus efficace que n'importe-quel code php pour faire ça.
kicest a écrit : Convient que l'on est loin de la simple problématique de tri de tableau en PHP, et je suis ouvert à vos remarques, suggestions et pourquoi pas "volée de bois verts" concernant ma méthode , et suis prêt à remettre en question ma conception, mais sur le tri de tableau ... avons nous eu un élément de réponse ? |
oui, on t'a déjà répondu plusieurs fois :
1) de regarder la doc des tableaux
2) d'y trouver la fonction usort()
Marsh Posté le 15-09-2008 à 16:11:29
Le jour où je vois débarquer un formulaire de 3000 lignes, j'engueule le développeur qui l'a pondu (où je le fais gentiment remarquer si c'est un de mes supérieurs qui a fait cette connerie). De même pour les listes déroulante de 200 choix pour lesquelles aucun filtre n'est disponible.
En fait, je ne vois pas un seul cas réel où un formulaire de 3000 lignes est préférable à une pagination de 25 ou 50 lignes modifiable.
Marsh Posté le 15-09-2008 à 16:12:37
kicest a écrit : Mais lorsque dans un formulaire j'ai 3000 lignes, et que l'utilisateur modifie 20 lignes de ces 3000, ne voulant pas (principe chez moi) faire un update massif sans contrôle et vérification de mes données, vaut-il mieux intérroger 3000 fois la base de données pour savoir quelles sont les 20 lignes à mettre à jour |
Aux dernières nouvelles tu peux aussi interroger une seule fois la db pour récupérer tes 3k enregistrement et differ dessus, ou bien lancer un bulk update (quitte à balancer des NOOP) qui risque fort de prendre moins de temps que ton boxon, ou bien te demander s'il est possible de marquer tes lignes comme dirty afin de savoir lesquelles ont été modifées et lesquelles ne l'ont pas été (e.g. stocker un checksum pour chaque ligne affichée, vérifier le checksum au retour), ...
Et bien sûr...
omega2 a écrit : Le jour où je vois débarquer un formulaire de 3000 lignes, j'engueule le développeur qui l'a pondu (où je le fais gentiment remarquer si c'est un de mes supérieurs qui a fait cette connerie). De même pour les listes déroulante de 200 choix pour lesquelles aucun filtre n'est disponible. En fait, je ne vois pas un seul cas réel où un formulaire de 3000 lignes est préférable à une pagination de 25 ou 50 lignes modifiable. |
Marsh Posté le 15-09-2008 à 16:20:26
masklinn a écrit : |
Et si cela répond à la demande utilisateur, que cela colle à son organisation ? tu éduques l'utilisateur ou remet en cause son organisation, ou dis au développeur qu'il a répondu au cahier des charges ?
Marsh Posté le 15-09-2008 à 16:22:08
kicest a écrit : |
Choix 1
Marsh Posté le 15-09-2008 à 16:22:12
kicest a écrit :
|
le client est roi, mais lui faire remarquer que ça a de bonnes chances d'être inutilisable ne fait de mal à personne.
Marsh Posté le 15-09-2008 à 16:22:18
ca repond surement à la demande de l'utilisateur, comme un marteau pour tuer une mouche
ce n'est pas pour ça que c'est la meilleure réponse possible, ni au niveau ergonomie, ni au niveau cout en ressources
Marsh Posté le 15-09-2008 à 16:23:33
skeye a écrit : |
Utilisateur borné et têtu !
Marsh Posté le 15-09-2008 à 16:25:59
flo850 a écrit : ca repond surement à la demande de l'utilisateur, comme un marteau pour tuer une mouche |
Tout dépend ton approche ...
tu fais ce que l'on te demande au sens strict du terme en ayant avertit l'utilisateur, peut importe il le veut comme ça, paye et assume les responsabilités !
Tu perds le développement ? ou essaye bon an mal an de lui fournir qq chose qui fonctionne un temps soit peu ?
Personne bien sur n'ayant jamais livré du code un peu bâclé, ou pas vraiment performant hein ?
Marsh Posté le 15-09-2008 à 16:29:58
je sais pas quoi te dire si ce n'etsq u'utilise usort et commande de la ram ainsi qu'un disque de plus pour ton serveur
EDI T: et sinon, tu peux aussi essayer de vendre un conseil au client, en lui proposant une option payante ( un joli truc en js . MAis ca me semble un peu choquant de t'entendre parlé de client et de $$ alors que tu décris toit meme comme non DBA et non développeur
Marsh Posté le 15-09-2008 à 16:30:41
flo850 a écrit : je sais pas quoi te dire si ce n'etsq u'utilise usort et commande de la ram ainsi qu'un disque de plus pour ton serveur |
et la ram pour les postes clients....ça peut faire un joli bordel, une pages avec un 3000 lignes de formulaire.
Marsh Posté le 15-09-2008 à 16:53:06
Hum, les tableaux en php c'est bien (tm), mais les gros tableau c'est pas génial niveau performance.
Il existe différentes solutions :
- garder le tableau dans un js dans une frame et le manipuler en Json (personne l'as trouvé celle là, bon ok je sort) <- a éviter
- utiliser proprement ta base.
- utiliser apc voir www.php.net/apc (ça ça rox fort, mais si les donnés sont par utilisateur oublie).
- pour taper plus de perf au niveau de la bdd, il faut utiliser le moteur memory de mysql qui stoque une table en mémoire (j'utilise ça pour stoquer mes sessions quand j'ai de la ram et pas de serialize...).
- revoir ton modèle de donnée
Marsh Posté le 15-09-2008 à 03:53:25
Bonjour,
je vous assure j'ai cherché je ne trouve pas ma solution ...
Voilà la question !
j'extrais d'une BDD des lignes que je stocke dans un tableau (Pour chaque ligne, je stocke dans un tableau associatif, nom de colonne / valeur).
$arr[$i] = array("a"=>"$row[a]","b"=>$row[b],"c"=>"$row[b]","d"=>$row[d],"e"=>"$row[e]","f"=>$row[f]);
Ce tableau est donc trié suivant l'ordre order by de la requête sql.
Pour ne pas trop surcharger la base de données avec beaucoup d'accès, mon tableau est "balladé" dans la SESSION utilisateurs, et est donc chargé une seule fois.
mais voilà j'ai besoin de faire des tris différents en fonction d'actions spécifiques dans des formulaires ...
1 - donc comment trier par exemple le tableau selon les valeurs des colonnes b, d et e ?
Le tri est b ASC, d DES, e ASC.
2 - enfin comment faire l' équivalent de l'ordre DISTINCT sur une colonne d'un tableau ? Par exemple les valeurs uniques de la colonnes d ?
Allez un bout de tableau pour illustrer :
b = forum, c = id_post, e = date_post
$arr[0] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"PHP","id_post"=>"1","date_post"=>"20080914" );
$arr[1] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"PHP","id_post"=>"2","date_post"=>"20080913" );
$arr[2] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"PHP","id_post"=>"3","date_post"=>"20080912" );
$arr[3] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"ASP","id_post"=>"1","date_post"=>"20080914" );
$arr[4] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"MYSQL","id_post"=>"1","date_post"=>"20080914" );
$arr[5] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"C++","id_post"=>"1","date_post"=>"20080912" );
$arr[6] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"C++","id_post"=>"1","date_post"=>"20080914" );
$arr[7] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"C++","id_post"=>"1","date_post"=>"20080914" );
$arr[8] = array("site"=>"Hardware","forum"=>"nouveau","categorie"=>"PHP","id_post"=>"1","date_post"=>"20080914" );
$arr[9] = array("site"=>"Hardware","forum"=>"nouveau","categorie"=>"PHP","id_post"=>"2","date_post"=>"20080913" );
Pour 1 on doit avoir :
$arrT[0] = array("site"=>"Hardware","forum"=>"nouveau","categorie"=>"PHP","id_post"=>"2","date_post"=>"20080913" );
$arrT[1] = array("site"=>"Hardware","forum"=>"nouveau","categorie"=>"PHP","id_post"=>"1","date_post"=>"20080914" );
$arrT[2] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"PHP","id_post"=>"3","date_post"=>"20080912" );
$arrT[3] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"PHP","id_post"=>"2","date_post"=>"20080913" );
$arrT[4] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"C++","id_post"=>"1","date_post"=>"20080912" );
$arrT[5] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"C++","id_post"=>"1","date_post"=>"20080914" );
$arrT[6] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"C++","id_post"=>"1","date_post"=>"20080914" );
$arrT[7] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"PHP","id_post"=>"1","date_post"=>"20080914" );
$arrT[8] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"ASP","id_post"=>"1","date_post"=>"20080914" );
$arrT[9] = array("site"=>"Hardware","forum"=>"programmation","categorie"=>"MYSQL","id_post"=>"1","date_post"=>"20080914" );
pour 2 on doit avoir :
$arrU[0][id_post] = "1";
$arrU[1][id_post] = "2";
$arrU[2][id_post] = "3";
ou même
$arrU[0] = "1";
$arrU[1] = "2";
$arrU[2] = "3";
Merci de votre aide ...
Message édité par kicest le 15-09-2008 à 16:29:29