Page 1 sur 2
Problème pour fusioner 2 tableaux
Posté : 10 juin 2009, 09:19
par supercanard
Bonjour,
Voilà j'ai 2 tableaux qui ressemble à ça :
Code : Tout sélectionner
Array
(
[0] => ID_PAGE
[1] => LIBELLE
[2] => ID_PAGE
[3] => LIBELLE
[4] => ID_PAGE
[5] => LIBELLE
)
Array
(
[0] => 23456
[1] => test
[2] => 23456
[3] => test
[4] => 23456
[5] => test
)
Je voudrais arriver à les rassemble de manière à ce que ça donne :
Code : Tout sélectionner
Array
(
[0] => array( [ID_PAGE] =>23456, [LIBELLE] => test )
[1] => etc...
)
Mais c'est pas du gateau...
premier essai :
print_r($cle);
print_r($valeur);
foreach($cle as $k=>$v){
$data[$k] = array($v => $valeur[$k]);
}
print_r($data);
Mais ça ne donne pas vraiment le résultat recherché :
Code : Tout sélectionner
Array
(
[0] => Array
(
[ID_PAGE] => 23456
)
[1] => Array
(
[LIBELLE] => test
)
[2] => Array
(
[ID_PAGE] => 23456
)
[3] => Array
(
[LIBELLE] => test
)
[4] => Array
(
[ID_PAGE] => 23456
)
[5] => Array
(
[LIBELLE] => test
)
)
Quelqun à une idée ?

Posté : 10 juin 2009, 09:48
par stopher
Salut ,
as tu regardé du coté de array_combine() ?
http://fr.php.net/manual/fr/function.array-combine.php
Ch.
Posté : 10 juin 2009, 10:03
par supercanard
Oui j'ai essayé de combiner les 2 tableaux mais ça fusionne toutes les valeurs, je me retrouve avec une seule ligne :
Array
(
[ID_PAGE] => 23456
[LIBELLE] => test
)
Ceci dit c'est une piste peut être
Re: Problème pour fusioner 2 tableaux
Posté : 10 juin 2009, 10:13
par zeus
Bonjour,
Quand je prend le tableau auquel tu voudrais arriver, soit le code suivant :
Code : Tout sélectionner
Array
(
[0] => array( [ID_PAGE] =>23456, [LIBELLE] => test )
[1] => etc...
)
Je me rend compte que ce tableau est un fait un tableau de tableau. C'est à dire que l'élément 0 est le 1er tableau, l'élément 1 le second tableau, ...
Du coup, il suffit d'affecter chacun des sous-tableaux à ton tableau principal :
print_r($cle);
print_r($valeur);
$data[] = $cle;
$data[] = $valeur;
print_r($data);
Et là, ça devrait rouler

Posté : 10 juin 2009, 10:43
par supercanard
Humm je crois que ça pourrait en effet marcher mais ça donne en fait une autre forme de tableau :
Array
(
[0] => Array
(
[0] => ID_PAGE
[1] => LIBELLE
[2] => ID_PAGE
[3] => LIBELLE
[4] => ID_PAGE
[5] => LIBELLE
)
[1] => Array
(
[0] => 23456
[1] => test
[2] => 23456
[3] => test
[4] => 23456
[5] => test
)
)
A partir de la valeur [0][0] on doit pouvoir via un foreach sortir la correspondance qui eest [1][0] mais j'y arrive vraiment pas là. Pourtant ça doit être super simple, mais y'a un moment je finni par m'embrouiller

Posté : 10 juin 2009, 11:15
par zeus
Excuse moi, j'ai lu ta demande trop rapidement.
Du coup, la solution est de parcourir le tableau des clés, et de récupérer la valeur correspondant à l'index de la clé parcouru, soit :
print_r($a_cle);
print_r($a_valeur);
$a_tmp = array();
foreach($a_cle as $index=>$cle){
$a_tmp[$cle] = $a_valeur[$cle];
}
$a_data[] = $a_tmp;
print_r($a_data);
Posté : 10 juin 2009, 12:02
par supercanard
Merci j'y était presque à un moment mais j'avais pas trouvé cette solution.
Il y avait juste une petite coquille dans ton code mais c'est bien ça, merci encore =)
Bon pour la peine je donne ma fonction complète qui sert en fait à parser un fichier texte avec comme possibilités :
- Tout extraire
- Extraire toutes les occurences d'une balise passé en paramètre
- Extraire la première balise qu'elle qu'elle soit :
function extrait_flux($source, $cherche){
/*
param $source => chemin du fichier
param $balise => balises à extraire ( all = toutes, first = la première, X = toutes celles qui correspondent à X )
*/
$flux = file_get_contents($source);
if($cherche != 'first'){
$masque = ($cherche == 'all') ? '{(.*)}(.*){\/(.*)}' : '{('.$cherche.')}(.*){\/('.$cherche.')}';
preg_match_all('/'.$masque.'/sU', $flux, $output);
$a_cle = $output[1];
$a_valeur = $output[2];
$a_tmp = array();
foreach($a_cle as $index=>$cle){
$a_tmp[$cle] = $a_valeur[$index];
$data[] = $a_tmp;
}
}
else{
$masque = '{(.*)}(.*){\/(.*)}';
preg_match('/'.$masque.'/sU', $flux, $output);
$data[$output[1]] = $output[2];
}
return $data;
}
$menu = extrait_flux('data/menu.txt', 'all');
print_r($menu);
data menu.txt :
Code : Tout sélectionner
{ID_PAGE}13456{/ID_PAGE}
{LIBELLE}test 2{/LIBELLE}
{ID_PAGE}23456{/ID_PAGE}
{LIBELLE}test 3{/LIBELLE}
{ID_PAGE}33456{/ID_PAGE}
{LIBELLE}test 4{/LIBELLE}
Resultat :
Code : Tout sélectionner
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
)
)
Posté : 10 juin 2009, 14:38
par zeus
Je ne remet pas en doute ma coquille, mais ta correction me semble erronée
Quand je regarde ton résultat, le même ID_PAGE apparait plusieurs fois, et pour plusieurs LIBELLE différents

Posté : 10 juin 2009, 14:46
par supercanard
J'avais même pas vu
On dirait que ça doublonne
Posté : 10 juin 2009, 14:50
par zeus
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 ?
Posté : 10 juin 2009, 15:05
par supercanard
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

Posté : 10 juin 2009, 15:27
par zeus
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() ?
Posté : 10 juin 2009, 15:56
par supercanard
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
)
)
Posté : 10 juin 2009, 16:21
par zeus
Ce que je veux voir, ce sont les contenus de $a_valeur et $a_cle stp
Posté : 10 juin 2009, 16:54
par supercanard
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
)