Aller au contenu

Faire un 3eme tableau à partir de 2 tableaux distincts


Sujets conseillés

Posté

Hello,

Je récupère des données dans 2 bases distinctes que je matche et je veux créé un 3eme tableau contant juste les référentiels de chaque tableau commun.

Je pensais avoir trouvé la solution avec array_push() mais y a un truc qui coince :

	sql_connect($dc_server,$dc_user,$dc_pass,$dc_db);
$query = "SELECT cat_id, cat_libelle FROM " . $dc_prefix . "categorie ORDER BY cat_ord ASC";
sql_query($query);
$dc_cat = $query_result;
sql_close();

sql_connect($drupal_server,$drupal_user,$drupal_pass,$drupal_db);
$query = "SELECT tid, name FROM " . $drupal_prefix . "term_data ORDER BY tid ASC";
sql_query($query);
$drupal_cat = $query_result;

$new_dc = array( 0 => 0);
while($dc_array = mysql_fetch_array($dc_cat, MYSQL_NUM))
{
echo $dc_array[1] . '<br />';
$drupal_array = mysql_fetch_array($drupal_cat, MYSQL_NUM);
foreach($drupal_array as $drupal => $values)
{
if ($values == $dc_array[1])
{
echo 'well done ! : ' . $dc_array[1] . ' - ' . $dc_array[0] . ' - ' . $drupal_array[0] . '<br />';
}
}
}

array_push($dc_new, $dc_array[0] => $drupal_array[0]) me renvoie une erreur sur la présence du =>

J'obtiens un truc du genre :

Ma Vie
well done ! : Ma Vie - 10 - 1
Humeurs & réflexions
well done ! : Humeurs & réflexions - 3 - 2
CV
well done ! : CV - 2 - 3
Projets
well done ! : Projets - 13 - 4
Dev Web
well done ! : Dev Web - 19 - 5
CMS
well done ! : CMS - 18 - 6
Libritudes
well done ! : Libritudes - 8 - 7
WWW, NTIC & Co
well done ! : WWW, NTIC & Co - 7 - 8
Loisirs
well done ! : Loisirs - 5 - 9
Fourre-tout
well done ! : Fourre-tout - 6 - 10
En Vrac
well done ! : En Vrac - 20 - 11
Vie des sites
well done ! : Vie des sites - 21 - 12

Je voudrais avoir un tableau qui fait en fait :

array(
dc_array[0] => $drupal_array[0],
dc_array[0] => $drupal_array[0],
dc_array[0] => $drupal_array[0]
)

pour avoir :

array(
5 => 9,
6 => 10,
...
21 => 12);

et avoir ainsi mon mapping.

Qqn peut m'aider ?

Posté

Le problème dans mon cas est que le tableau ne contient que les dernières lignes de chaque tableau...

A voir comment je peux m'en dépatouiller... :-/

Posté

Bonjour,

Pour obtenir le tableau final que tu souhaites j'utiliserais la création d'index automatiques (bref quand tu donne un index qui n'existe pas PHP crée cet index... s'il existe déjà la valeur que tu lui attribue remplace la précédente). Dans la condition vérifiant si le nom de la catégorie Drupal est égal à celle de DC (donc où tu affiche "well done! ...") j'utiliserais ce code :

$new_dc[$dc_array[0]] = $drupal_array[0];

Ah et pour créer ton tableau $new_dc je n'ai pas bien compris pourquoi tu mettais l'élément avec l'index "0" à la valeur 0 :S

Je ne comprends pas non plus l'utilité de ta boucle foreach... vu que tu connais les clés des tableaux dans lesquelles se trouvent les id des catégories (dc_array[0] et $drupal_array[0]).

Mais peut-être ai-je mal compris ton problème ? :S

Posté

Pour le $new_dc(0 =>0), c'était pour faire tricher honteusement ;) - c'est enlevé depuis car c'est pas acceptable comme solution.

L'idée de ce bout de code c'est :

1/ Parcourir le résultat d'une requetete SQL

2/ Pour chaque résultat, je le compare avec le résultat d'une seconde requete SQL pour définir si j'ai un mapping qui se fait ou pas

l'étape 3, que je cherche à obtenir, c'est d'avoir un tableau qui me donne pour un id de mon tableau DC, la valeur dans mon tableau drupal...

Posté

Ok..

Donc j'avais bien compris. Ce que je ne comprends pas c'est que ton foreach va analyser une ligne de ta table de Drupal à chaque itération de ta boucle while. Mais imaginons que ta table de Drupal ne soit pas "alignée" sur la table de DC, ta condition ne sera jamais vérifiée :S Il faudrait vérifier toutes les valeurs de la table de Drupal à chaque itération de la boucle while. Cela représente une grosse charge s'il s'agit de grandes quantités de données.

Sinon ce que je t'ai dit reste valable... J'aurais écrit ce code ainsi :

<?php
sql_connect($dc_server,$dc_user,$dc_pass,$dc_db);
$query = "SELECT cat_id, cat_libelle FROM " . $dc_prefix . "categorie ORDER BY cat_ord ASC";
sql_query($query);
$dc_cat = $query_result;
sql_close();

sql_connect($drupal_server,$drupal_user,$drupal_pass,$drupal_db);
$query = "SELECT tid, name FROM " . $drupal_prefix . "term_data ORDER BY tid ASC";
sql_query($query);
$drupal_cat = $query_result;

// Stocker le tableau qui sera utilisé à chaque fois...c'est plus sain que de refaire le requête à chaque itération
$drupal_array = array();
while($drupal_row = mysql_fetch_array($drupal_cat, MYSQL_NUM)) {
$drupal_array[$drupal_row[0]] = $drupal_row[1]; // La forme id => name ... on aurait aussi pu stocker un tableau, mais pourquoi charger la mémoire :/
}


$new_dc = array();
while($dc_array = mysql_fetch_array($dc_cat, MYSQL_NUM)) {
$category_match = array_search($dc_array[1],$drupal_array); // Ici tu fais une recherche du nom de la catégorie DC dans le tableau drupal, s'il y a correspondance la réponse de array search sera l'id de la catégorie.
if($category_match !== false) {
$new_dc[$dc_array[0]] = $category_match;
} else {
// Ici tu peux traîter d'un cas ou il n'y aurait pas de correspondance pour une catégorie de la table DC
}
}

echo "<pre>"; print_r($new_dc); echo "</pre>"; ?>

(Je n'ai rien testé... j'ai écrit ça à la volée :S, mais l'idée est là... il y a sûrement d'autres moyens de faire)

Posté

Ok, je regarde et te réponds ce soir ou demain ;)

Merci de t'être penché dessus !

Posté

C'était tout à fait ça, nickel chrome, sans la moindre erreur...

Merci beaucoup !! :)

Posté

De rien !

Toutefois comme je te l'ai dit, ce n'est peut-être pas la solution la plus performante, donc si c'est pour un usage intensif il faudra peut-être se pencher plus longuement sur le problème ;) À en lire ton blog, il s'agit plutôt d'une tâche qui serait réalisée qu'occasionnellement donc à toi de voir si tu souhaites vraiment passer plus de temps à chercher la solution la plus performante :)

Posté

Nan, pour le coup, je veux juste un truc qui marche, il ne s'inscrit pas en effet dans la durée ce développement... ;)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...