Problème pour fusioner 2 tableaux

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème pour fusioner 2 tableaux

par supercanard » 11 juin 2009, 08:27

Ah oui j'oubliais, si malgré tout tu veux persister dans la direction d'utiliser des fichiers textes (bien que cette solution soit moins facilement évolutive, moins robuste, très souvent moins performante et toujours plus difficile à lettre en oeuvre), n'oublies pas qu'il peut être intéressant que ces fichiers textes soient composés de tableaux serialisés...
Oui c'est sur que la serialisation facilite pas mal les choses. Beaucoups plus simple que de baliser le contenu ça c'est clair. Pourquoi pas après tout :roll:

par AB » 11 juin 2009, 00:52

Ah oui j'oubliais, si malgré tout tu veux persister dans la direction d'utiliser des fichiers textes (bien que cette solution soit moins facilement évolutive, moins robuste, très souvent moins performante et toujours plus difficile à mettre en oeuvre), n'oublies pas qu'il peut être intéressant que ces fichiers textes soient composés de tableaux serialisés...

par AB » 10 juin 2009, 23:31

ah oui effectivement pour la longueur du tableau, bien vu :wink:

Logiquement dans les fichiers sources le nombre de balise sera cohérent quitte à avoir des balises vides

C'est résolu, merci de votre aide à tous :D
Et la c'était facile encore, maintenant si je mpose la question de comment remplacer le contenu d'une balise particulière dans le fichier source, je ne vois pour l'instant pas d'autres solution que de parser tout le contenu, ajouter un éléme,nt au tableau et réécrire le fichier. En terme de performance ça doit être bof moyen non ?
Je ne sais pas comment ça se passe du coté des lib XML mais si ça se trouve c'est la seule solution ?
Alors si c'est résolu n'oublies pas de cliquer sur le bouton "résolu" :)

Pour le reste, on t'avais bien dit que le plus efficace est d'utiliser une bdd puisque les bdd sont spécialement conçues pour gérer des données sous forme tabulaire avec des performances et des fonctions qui vont bien :wink:

par supercanard » 10 juin 2009, 22:50

ah oui effectivement pour la longueur du tableau, bien vu :wink:

Logiquement dans les fichiers sources le nombre de balise sera cohérent quitte à avoir des balises vides

C'est résolu, merci de votre aide à tous :D
Et la c'était facile encore, maintenant si je mpose la question de comment remplacer le contenu d'une balise particulière dans le fichier source, je ne vois pour l'instant pas d'autres solution que de parser tout le contenu, ajouter un éléme,nt au tableau et réécrire le fichier. En terme de performance ça doit être bof moyen non ?
Je ne sais pas comment ça se passe du coté des lib XML mais si ça se trouve c'est la seule solution ?

par AB » 10 juin 2009, 22:43

Bah disons que le risque pour que cela fonctionne toujours correctement est qu'il faut que tes tableaux $a et $b soient par exemple toujours de même longueur ...

Alors ce topic sur ce cas précis de tableaux est résolu ?

par supercanard » 10 juin 2009, 22:27

Bon sang ça me parait logique maintenant que je vois ton code !

J'avais essayer de faire un test similaire mais j'étais coincé par ce que j'avais imaginé que array_key_exist() ne pouvait se faire que sur un tableau entier et non sur une clé précise du tableau.

Pour les tableaux de départ ils sont crades mais ça vient peut être du fait qu'il ne faudrait pas faire un preg_match_all mais plutot d'essayer de trouver les balises ligne par lignes un peu commen dans cette source que j'ai du mal à piger : http://www.phpsources.org/scripts172-PHP.htm

par AB » 10 juin 2009, 21:26

Alors un truc comme ça peut-être
<?php
$a = array
(
0 => 'ID_PAGE',
1 => 'LIBELLE',
2 => 'ID_PAGE',
3 => 'LIBELLE',
4 => 'ID_PAGE',
5 => 'LIBELLE'
);

$b = array
(
0 => '13456',
1 => 'test 1',
2 => '23456',
3 => 'test 2',
4 => '33456',
5 => 'test 3',
);

$result = array();
$i = 0;
foreach ($a as $key => $value) {

	if (isset($result[$i]) && array_key_exists($value,$result[$i])) 
		
		$result[++$i][$value] = $b[$key]; 
		
		else
		
		$result[$i][$value] = $b[$key];
}
echo '<pre>';
print_r($result);
echo '</pre>';

/*Affiche :
Array
(
    [0] => Array
        (
            [ID_PAGE] => 13456
            [LIBELLE] => test 1
        )

    [1] => Array
        (
            [ID_PAGE] => 23456
            [LIBELLE] => test 2
        )

    [2] => Array
        (
            [ID_PAGE] => 33456
            [LIBELLE] => test 3
        )

)
*/
?>
Enfin bon ce qui compte aussi c'est de partir avec des tableaux cohérents dès le départ et là la base me paraît un peu risquée.

par supercanard » 10 juin 2009, 19:27

Tu as raison finalement c'est plutôt une histoire de tableau que de regex.

non c'est plus résolu en fait :D
Je crois que la solution n'est pas loin ceci dit, celle de zeux était presque la bonne. Un truc m'échappe dans cette histoire.

Pourtant j'ai très bien en tête ce que devrais être le tableau final :

(
[0] => ( [ID_PAGE] => valeur, [LIBELLE] => valeur )
[1] => ( [ID_PAGE] => valeur, [LIBELLE] => valeur )
)

Mais je sais pas, les tableaux de départs sont assez byzar pour le coup

par AB » 10 juin 2009, 19:13

Bon alors c'est apparemment résolu...

Quand dans ton précédent topic tu disais que cette méthode allait te "permettre de manipuler un peu les regex", pour avoir fait sensiblement l'équivalent, j'ai eu envie de te répondre que ça allait surtout t'apprendre la manipulation des tableaux.

Je vois que c'est bien parti dans ce sens :wink:

Pour le reste le code résultant sera difficilement réutilisable et peu évolutif (imagine que tu veuilles ensuite ajouter une recherche sur le texte...) mais pour sûr c'est un bon exercice.

EDIT : Alors le temps que je poste ce n'est plus résolu ?

par supercanard » 10 juin 2009, 16:54

Array
(
[0] => ID_PAGE
[1] => LIBELLE
[2] => ID_PAGE
[3] => LIBELLE
[4] => ID_PAGE
[5] => LIBELLE
)
Array
(
[0] => 13456
[1] => test 2
[2] => 23456
[3] => test 3
[4] => 33456
[5] => test 4
)

par zeus » 10 juin 2009, 16:21

Ce que je veux voir, ce sont les contenus de $a_valeur et $a_cle stp

par supercanard » 10 juin 2009, 15:56

C'est le print_r final

En gros :
foreach($a_cle as $index=>$cle){ 
		   $a_tmp[$cle] = $a_valeur[$index];
		   $data[] = $a_tmp;
		}
Donne :

Array
(
[0] => Array
(
[ID_PAGE] => 13456
)

[1] => Array
(
[ID_PAGE] => 13456
[LIBELLE] => test 2
)

[2] => Array
(
[ID_PAGE] => 23456
[LIBELLE] => test 2
)

[3] => Array
(
[ID_PAGE] => 23456
[LIBELLE] => test 3
)

[4] => Array
(
[ID_PAGE] => 33456
[LIBELLE] => test 3
)

[5] => Array
(
[ID_PAGE] => 33456
[LIBELLE] => test 4
)

)


Et :
$a_tmp = array(); 
        foreach($a_cle as $index=>$cle){  
           $data[][$cle] = $a_valeur[$index]; 
        }
donne :

Array
(
[0] => Array
(
[ID_PAGE] => 13456
)

[1] => Array
(
[LIBELLE] => test 2
)

[2] => Array
(
[ID_PAGE] => 23456
)

[3] => Array
(
[LIBELLE] => test 3
)

[4] => Array
(
[ID_PAGE] => 33456
)

[5] => Array
(
[LIBELLE] => test 4
)

)

par zeus » 10 juin 2009, 15:27

Tu es sûr que ce que tu m'as montré en haut, c'est le contenu de tes tableaux ? le résultat des print_r() ?

par supercanard » 10 juin 2009, 15:05

Pas tout à fait identique il renvois :
Array
(
[0] => Array
(
[ID_PAGE] => 13456
)

[1] => Array
(
[LIBELLE] => test 2
)

[2] => Array
(
[ID_PAGE] => 23456
)

[3] => Array
(
[LIBELLE] => test 3
)

[4] => Array
(
[ID_PAGE] => 33456
)

[5] => Array
(
[LIBELLE] => test 4
)

)
C'est un casse tête cette histoire en fait :D

par zeus » 10 juin 2009, 14:50

Je suis sûr que ça vient de là :
        $a_tmp = array(); 
        foreach($a_cle as $index=>$cle){  
           $a_tmp[$cle] = $a_valeur[$index]; 
           $data[] = $a_tmp; 
        }
ce code est indique à
        $a_tmp = array(); 
        foreach($a_cle as $index=>$cle){  
           $data[][$cle] = $a_valeur[$index]; 
        }
et est invalide.

Qu'est-ce qui t'a fait découvrir ma coquille ?