Comparer 2 tableaux

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 14:41

Bon je poste pour la forme histoire de ne pas avoir fait ça pour rien :P
<?php
// émulation de la fonction array_intersect_key pour PHP 4
function my_array_intersect_key(&$a, &$b) {
  $array = array();
  while (list($key,$value) = each($a)) {
   if (isset($b[$key]))
     $array[$key] = $value;
  }
  return $array;
}


$buteursVotes = array ("papin" => 2, "zidane" => 1,  "boli" => 1, "ginola" => 1);//buteurs votés pour l'équipe A
$buteursReels = array ("papin" => 1, "ginola" => 1, "zidane" => 3, "vairelles" => 2); // comment ça Vairelles marquait pas de buts ?! :lol:
echo '<b>Buteurs votés : </b>'; echo '<pre>'; print_r($buteursVotes); echo '</pre>';
echo '<b>Buteurs réels : </b>'; echo '<pre>'; print_r($buteursReels); echo '</pre>';

// d'abord, la liste des buteurs trouvés
echo '<b>Buteurs trouvés :</b><br />';
// grâce à la fonction PHP 5
$buteursTrouves = array_intersect_key($buteursVotes, $buteursReels);

// pour PHP 4
 $buteursTrouvesBis = my_array_intersect_key($buteursVotes, $buteursReels);
 
echo '</pre>';
echo '<b>-- Fonction array_intersect_key() (PHP 5)</b><br /><pre>';
print_r($buteursTrouves);
echo '</pre>';

echo '<b>-- Fonction my_array_intersect_key() (PHP 4)</b><br /><pre>';
print_r($buteursTrouvesBis);
echo '</pre>';

// calcul différence de buts pronostiqués/marqués
// avec une boucle foreach
foreach($buteursTrouves as $nomButeur => $NbButs) {
	// ici tu peux inverser le signe si tu préfères que -1 soit synonyme de "le buteur a marqué 1 de + que le pronostic"
	$differenceButsTrouves[$nomButeur] = $buteursReels[$nomButeur] - $NbButs; 
}
echo '<b>Différences de buts : </b><br /><pre>';
print_r($differenceButsTrouves);
echo '</pre>';
?>

Code : Tout sélectionner

Buteurs votés : Array ( [papin] => 2 [zidane] => 1 [boli] => 1 [ginola] => 1 ) Buteurs réels : Array ( [papin] => 1 [ginola] => 1 [zidane] => 3 [vairelles] => 2 ) Buteurs trouvés : -- Fonction array_intersect_key() (PHP 5) Array ( [papin] => 2 [zidane] => 1 [ginola] => 1 ) -- Fonction my_array_intersect_key() (PHP 4) Array ( [papin] => 2 [zidane] => 1 [ginola] => 1 ) Différences de buts : Array ( [papin] => -1 [zidane] => 2 [ginola] => 0 )
Personnellement, si on enlève le code de mise en forme, je trouve ça plus léger.

Pour la dernière opération (calcul des points) je n'ai pas fait car je ne sais pas comment ça marche : 1 pt/but trouvé ? Si on a pronostiqué + de buts que ce que le joueur n'a marqué que se passe-t-il ? Bref, manque d'infos pour le faire :)

Là, tu fais ce que tu veux, mais pense toujours à regarder dans la doc. Il y a de très bonnes fonctions PHP 5 et souvent dans les commentaires il y a le code pour les émuler en PHP 4.

Maintenant j'arrête, ça commence à m'embrouiller :lol:
Modifié en dernier par ouckileou le 28 juil. 2006, 15:02, modifié 1 fois.

Eléphant du PHP | 451 Messages

28 juil. 2006, 14:43

Effectivement, ça marche, mais j'arrive pas à tout décortiquer là dedans. Je brainstorm !
En fait l'idée c'est de modifier les tableaux :
$buteursVotes = array ("papin", "boli", "boli", "makelele");
$buteursReels = array ("papin", "boli", "zidane");
en :
$bv=array("boli1" => "boli", "boli2" => "boli", "makelele1" => "makelele", "papin1" => "papin");
$br=array("boli1" => "boli", "papin1" => "papin", "zidane1" => "zidane");
Ca blinde la comparaison pusique les cles deviennent uniques (et comparables).

J'ai rajouté quelques commentaires, si ça peut t'aider.
Je ne doute pas qu'il y ait plus simple mais je n'ai pas trop de temps à consacrer et puis faut bien que je te laisse écrire ton code, tu trouveras probablement toi même.
(Une idée c'est de mettre 0 dans le tableau à la place du nom des joueurs, si les contenus de $bv et $br sont identiques, c'est bon : seuls les indices sont utilisés...)
// Déclaration des tableaux
$buteursVotes = array ("papin", "boli", "boli", "makelele");//buteurs votés pour l'équipe A
$buteursReels = array ("papin", "boli", "zidane");//buteurs réels pour l'équipe A
//Tri des tableaux
  sort($buteursVotes);
  sort($buteursReels);
// petite vérif...
  echo "<pre>";
  echo "\n\rbuteursVotes : ";
  print_r($buteursVotes);
  echo "\n\rbuteursReels : ";
  print_r($buteursReels);
  echo "</pre>";
// on construit le tableau $bv
  echo "<BR>lecture buteursVotes";
foreach($buteursVotes as $k => $v) {
// On initialise/complete avec la variable du nom_du_joueur
${$v}[count(${$v})]=$v;
// count(${$v}) indique le xieme but (0, 1, 2, 3...)
// on renseigne le tableau d'indice nom concaténé avec xieme_but
$bv[$v.count(${$v})]=$v;
}
// on remet a zero les tableaux temporaires (nom_du_joueur) utilisés
foreach($buteursVotes as $k => $v) {
unset(${$v});
}
// on construit le tableau $br de même
  echo "<BR>lecture buteursReels";
foreach($buteursReels as $k => $v) {
${$v}[count(${$v})]=$v;
$br[$v.count(${$v})]=$v;
}
// on a maintenant des des tableaux indexéx [nom_du_joueur xieme_but]
// petite verif...
  echo "<pre>";
  echo "\n\rbv : ";
  print_r($bv);
  echo "\n\rbr : ";
  print_r($br);
  echo "</pre>";
// reste plus qu'a comparer
  echo "<HR>array_intersect_assoc<BR>";
  $result = array_intersect_assoc ($bv, $br);
  print_r($result);
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphant du PHP | 331 Messages

28 juil. 2006, 14:45

Je sais que cela aurait été peut-être plus simple mais ne connaissant pas toutes les ficelles de php encore, j'ai préféré me lancer dans cette méthode.

Et voilà justement que j'ai trouvé, je vous laisse regarder:
<?php
// On initialise les tableaux et les variables
$ButeursDom_Votes = array ("Papin", "Papin", "Papin", "Platini", "Ginola");
sort ($ButeursDom_Votes);
$ButeursDom_Reels = array ("Ginola", "Papin", "Papin");
sort ($ButeursDom_Reels);
$Points = 0;

// Puis on fait deux boucles pour comparer les tableux et maj les points :
for ($r = 0; $r < 3; $r++)
{
	for ($v = 0; $v < 5; $v++)
	{
		if ($ButeursDom_Votes[$v] == $ButeursDom_Reels[$r])
		{
		echo $ButeursDom_Votes[$v];
		echo $ButeursDom_Reels[$r];				
		$Points = $Points + 1;
		$ButeursDom_Reels = array_splice ($ButeursDom_Reels, 1);
		echo "<br />";		
		}		
	}
}

echo $Points;
?>
ce qui me retourne la chose suivante:
GinolaGinola
PapinPapin
PapinPapin
3
Maintenant, il ne me reste plus qu'à alimenter mes deux tableaux de base via des requetes et de calculer la taille de ces tableaux de manière à mettre en variable la longueur de mes boucles qui suivent.

D'ailleurs, pourriez-vous me dire comment à partir de ça :
$ButeursDom_Votes = array ("Papin", "Papin", "Papin", "Platini", "Ginola");
, je peux en trouver la valeur 5 ?

Merci encore à vous deux !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 14:48

Si ta fonction marche ça va garde là. c'est juste qu'il vaut mieux essayer le plus possible d'utiliser les fonctions prédéfinies qui sont plus rapides et surtout qui allègent le code ce qui le rend plus facilement maintenable (quand tu repasses 6 mois après tu comprends pas forcément la logique qui t'a fait faire telle chose)
D'ailleurs, pourriez-vous me dire comment à partir de ça :
$ButeursDom_Votes = array ("Papin", "Papin", "Papin", "Platini", "Ginola");
, je peux en trouver la valeur 5 ?
La réponse se trouve très facilement dans cette liste :
http://fr.php.net/manual/fr/ref.array.php

Eléphant du PHP | 451 Messages

28 juil. 2006, 14:48

Bon je poste pour la forme histoire de ne pas avoir fait ça pour rien :P
Je note qu'il y a une émulation de array_intersect_key pour PHP 4, j'écris encore du code en PHP4 !
Merci ouckileou ;)
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Eléphant du PHP | 451 Messages

28 juil. 2006, 14:55

Bah c'est pragmatique comme code :)
Commente bien pour t'y retrouver dans 6 mois ;)
Autrement pour ce que tu cherches (je pense que tu as assez bossé, je te donne la solution) regarde du côté de count().
Jpaul
J'essaye d'aider : parfois je fais des erreurs, on me les corrige et j'apprends un peu plus. Super ce forum :)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 14:55

[Je note qu'il y a une émulation de array_intersect_key pour PHP 4, j'écris encore du code en PHP4 !
L'émulation n'est pas de moi, trouvée dans les commentaires de la doc (je la retrouve plus ! :shock:)

Il y a genre 40 fonctions pour les tableaux, il faut donc se dire qu'a priori tout est possible, et aller voir la liste si une ne correspond pas.
Généralement il suffit d'en combiner 2 et c'est bon.

Et il faut penser à regarder les commentaires qui regorgent d'astuces, d'émulation PHP 4 etc.

;)

Eléphant du PHP | 331 Messages

28 juil. 2006, 14:56

Bon, les gars, vous êtes géniaux !!! :lol:

Vous m'avez beaucoup aidé et de voir vos codes m'a permit de comprendre beaucoup de nouvelles choses !
Merci pour le temps que vous avez pris pour mon problème !

Je vous dois combien ? :?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 14:58

Je vous dois combien ? :?
Un clic sur le tag Résolu suffira