Problème pour fusioner 2 tableaux

Mammouth du PHP | 531 Messages

10 juin 2009, 09:19

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 ? :?

ViPHP
ViPHP | 1136 Messages

10 juin 2009, 09:48

Salut ,

as tu regardé du coté de array_combine() ?

http://fr.php.net/manual/fr/function.array-combine.php

Ch.

Mammouth du PHP | 531 Messages

10 juin 2009, 10:03

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2009, 10:13

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 ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

10 juin 2009, 10:43

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 :D

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2009, 11:15

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);
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

10 juin 2009, 12:02

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 ) )

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2009, 14:38

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 :(
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

10 juin 2009, 14:46

J'avais même pas vu
On dirait que ça doublonne

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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 ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

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() ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

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
)

)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2009, 16:21

Ce que je veux voir, ce sont les contenus de $a_valeur et $a_cle stp
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 531 Messages

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
)