Fusion de deux tableau

Eléphant du PHP | 72 Messages

22 oct. 2009, 20:31

Bonjour,

J'ai recupéré le contenu d'un fichier xml sous la forme d'un iterateur.
$iFile_Xml = new RecursiveIteratorIterator ( new SimpleXMLIterator('TOTO.xml',null,true) );
nous sommes d'accord qu'un iterateur est parcourable l'aide d'une boucle foreach , c'est donc un tableau.

J'ai maintenant un deuxieme tableau
$aMyArray = array ('sKey1', 'sKey2');

ce deuxieme tableau me servirait à definir des variables tal que :

$sKey1 = le premier noeud de mon fichier xml

DONC EN CONCLUSION , je souhaite recuperer les valeurs de mon premier tableau pour les faires correspondre dans le meme ordre aux elements composant mon tableau (iterateur).

en effet, deux boucles foreach imbriqués n'ont rien donné.

D'avance merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 oct. 2009, 08:07

Bonjour,

Aurais-tu un exemple concret de ce que tu as en entrée et de ce que tu veux obtenir au final?
Quand tout le reste a échoué, lisez le mode d'emploi...

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

23 oct. 2009, 11:24

Avant d'aller au bout de ton idée, essaie déjà de te poser la question de savoir si tu as *vraiment* besoin de définir des variables dynamiques... La réponse est toujours non, et en plus c'est un gouffre à performances et à maintenance.

Donc, supposons que tu vas plutôt garder une notion de tableau associatif :) ça ne change rien au fond du problème, pour parcourir deux tableaux en parallèle :
$tableau1 = array('a', 'b', 'c');
$tableau2 = array('A', 'B');
$valeurs = array();
foreach ($tableau2 as $i => $k)
{
  $valeurs[$k] = $tableau1[$i];
}
Donc si ton itérateur est bien construit, tu dois pouvoir faire la même chose :
$nodes = array();
foreach ($aMyArray as $i => $var)
{
  $nodes[$var] = $iFile_Xml[$i];
}

ViPHP
fab
ViPHP | 2657 Messages

23 oct. 2009, 11:45

Hum sinon il peut faire ce qu'il veut rapidement et sans gouffres de perfs avec la fonction http://fr.php.net/extract non?
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphant du PHP | 72 Messages

23 oct. 2009, 14:34

Deja un grand merci à tous pour vos suggestions.

Extract ne m'est d'aucune utilité dans mon cas , mon but étant bien précis :

tableau 1 = arrray ( valeur 1, valeur 2);

tableau 2 = array ( valeurt 1 , valeurt 2); // ou tableau 2 est un iterateur

les deux tableau ont forcement le meme nombre de valeurs.

Grave à vous j'ai compris qu'il fallait passé par la réation d'un tableau numero 3 et apres lecture de la doc c'est bien la fonction array_combine qu'il me faut.

et voici le code :

$aKeys = array ( 'sType','sServeur');
	   
$iFile_Xml = new RecursiveIteratorIterator ( new SimpleXMLIterator('toto.xml',null,true) );

$aArray = array_combine( $aKeys,$iFile_Xml);

foreach ($aArray as $sClef=>$sValeur){
	
	$$sClef = $sValeur;
}


probleme, php me jette en disant que mon iterateur n'est pas un object .J'ai essayé de forcer en rajoutant (array) $iFile_Xml.

Php me jette sur la boucle foreach en me disant
array_combine() expects parameter 2 to be array, object given in ...
[23-Oct-2009 14:22:49] PHP Warning: Invalid argument supplied for foreach(


je vais continué à chercher mais j'ai plus beaucoup d'idées

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 oct. 2009, 15:24

Ok donc ça c'est ce que tu as en entrée :
mon but étant bien précis :

tableau 1 = arrray ( valeur 1, valeur 2);

tableau 2 = array ( valeurt 1 , valeurt 2); // ou tableau 2 est un iterateur

les deux tableau ont forcement le meme nombre de valeurs.
Mais en sortie, tu veux obtenir quoi?
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
fab
ViPHP | 2657 Messages

23 oct. 2009, 15:25

$iFile_xml c'est un objet est pas un tableau
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Eléphant du PHP | 72 Messages

23 oct. 2009, 15:51

Merci Fab

je sais que c'est un objet mais étant donné que c'etait un iterateur et qu'on le parcourt avec un foreach tel un tableau , ca pouvait marché .c'est d'ailleurs pour ca que je forçais le typage avec un (array).

Pour @rthur:

en sortie je veux ca :

tableaufinal = array ( 'valeur1'=>'valeurt1',
'valeur2'=>'valeurt2');

Ainsi , il me suffira de parcourir ce tableau afin d'assigner mes variables :

foreach (tableau final as $sClef=>$sValeur){
$sClef = $sValeur;
}

et le tour est joué.

Merci

ViPHP
fab
ViPHP | 2657 Messages

23 oct. 2009, 16:17

Sauf que array-combine n'a pas l'air de considérer les itérateurs comme des array.
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 oct. 2009, 19:24

Ok, j'ai compris...
Je propose un truc du genre alors :
$tableau1 = array ( "valeur1", "valeur2");
$tableau2 = array ( "valeurt 1" , "valeurt 2"); // ou tableau 2 est un iterateur

$tableaufinal=array();
$i=0;
foreach($tableau1 as $null) {
     $nouvo_tableau[$tableau1[$i]]=$tableau2[$i];
     $i++;
}

print_r($tableaufinal); // array ( 'valeur1'=>'valeurt1', 'valeur2'=>'valeurt2');
A toi de l'adapter pour que ça marche avec ton iterateur
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 72 Messages

23 oct. 2009, 20:20

exactement Fab !

Pour @rthur, j'ai testé avec succes ta solution et j'ai terminé par :
$aKeys = array ( 'sType','sServeur');
           
$iFile_Xml = new RecursiveIteratorIterator ( new SimpleXMLIterator('toto.xml',null,true) );
foreach ($iFile_Xml as $sValeur){
       
        $sTableau[] = $sValeur;
}
$aArray = array_combine( $aKeys, $sTableau);

foreach ($aArray as $sClef=>$sValeur){
    $$sClef = $sValeur;
}
Le sujet est resolue , je ne pense pas qu'on puisse faire mieux tant qu'un iterateur se parcourt comme un tableau mais n'en soit pas un .

Merci à tous.