Page 1 sur 2

Comparer 2 tableaux

Posté : 27 juil. 2006, 19:04
par jay64
Bonjour à tous,

Voici ce que j'ai écris :
<?php
$array1 = array ("vote" => "papin", "papin" , "cantona");//buteurs votés pour l'équipe A
$array2 = array ("reel" => "papin", "boli");//buteurs réels pour l'équipe A
  $result = array_intersect ($array1, $array2);
  print_r($result);
?> 
Je cherche en fait à comparer deux tableaux: le premier contient des buteurs pronostiqués et le second contient les buteurs réels.
Je cherche à attribuer au voteur 1 point par buteur trouvé.

Avec le code écrit ci-dessus, je rencontre un problème. En effet, je pensait que "Papin mettrait deux buts mais il n'en a mis qu'un.
Or cette fonction me renvoie le résultat suivant:
Array ( [vote] => papin [0] => papin )
Je suis donc embeté car je ne voudrais avoir Papin qu'une seule fois et non pas deux.

Quelqu'un aurait-il une petite idée?

Merci !

Posté : 28 juil. 2006, 09:31
par jay64
Allez les amis, un petit coup de pouce SVP ...

Re: Comparer 2 tableaux

Posté : 28 juil. 2006, 10:53
par ouckileou
<?php
$array1 = array("vote" => "papin", "papin" , "cantona");//buteurs votés pour l'équipe A
$array2 = array("reel" => "papin", "boli");//buteurs réels pour l'équipe A

$result = array_intersect($array1, $array2);
print_r($result);
?> 
Déjà, cette structure est un peu bizarre, tu n'as à chaque fois qu'une seule clé texte, qui apparament identifie le tableau. Hors c'est 1 clé => 1 valeur.

Je verrais plutôt ça pour identifier les 2 tableaux :
<?php
$buteursVotes = array("papin", "papin" , "cantona");//buteurs votés pour l'équipe A
$buteursReels = array("papin", "boli");//buteurs réels pour l'équipe A

$result = array_intersect($buteursVotes, $buteursReels);
print_r($result);
?> 
Ou même plutôt ça, qui serait plus logique :
<?php
$buteursVotes = array("papin" => 2 , "cantona" => 1);//buteurs votés pour l'équipe A
$buteursReels = array("papin" => 1 , "boli" => 1);//buteurs réels pour l'équipe A

$result = array_intersect_key($buteursVotes, $buteursReels);
print_r($result);
?> 
La fonction array_intersect_key() te renvoyant ce que tu veux, à savoir la seule clé présenté dans le tableau 1 et le tableau 2. Par contre c'est une fonction PHP5.

Posté : 28 juil. 2006, 10:57
par jpaul
Hum,
Déjà moi, je virerais les :
"vote" =>
et
"reel" =>
de la déclaration des arrays
$array1 = array ("papin", "papin" , "cantona");//buteurs votés pour l'équipe A
$array2 = array ("papin", "boli");//buteurs réels pour l'équipe A
Ainsi, le résultat sera uniforme :
Array ( [0] => papin [1] => papin ) 
Il semble alors que array_intersect_assoc() serait la bonne instruction de comparaison, ça donne le résultat :
Array ( [0] => papin ) 

Posté : 28 juil. 2006, 11:33
par jay64
Merci !

Le problème, c'est que cette méthode coince si les tableaux n'ont pas la même dimension :
$buteursVotes = array ("papin", "zidane", "boli");//buteurs votés pour l'équipe A
$buteursReels = array ("papin", "boli");//buteurs réels pour l'équipe A
ce qui donne uniquement:
Array ( [0] => papin )
alors qu'il devrait aussi trouver l'occurence "boli"

Re: Comparer 2 tableaux

Posté : 28 juil. 2006, 11:34
par jay64
Par contre c'est une fonction PHP5.
Hélas, je suis en PHP 4 !

Posté : 28 juil. 2006, 11:39
par ouckileou
Merci !

Le problème, c'est que cette méthode coince si les tableaux n'ont pas la même dimension :
$buteursVotes = array ("papin", "zidane", "boli");//buteurs votés pour l'équipe A
$buteursReels = array ("papin", "boli");//buteurs réels pour l'équipe A
ce qui donne uniquement:
Array ( [0] => papin )
alors qu'il devrait aussi trouver l'occurence "boli"
C'est parceque ce n'est pas la bonne fonction, vu que ce ne sont pas des tableaux associatifs mais indexés numériquement.

=> array_intersect() tout simplement, et le code fonctionne

Posté : 28 juil. 2006, 11:44
par jay64
ok, mais là, avec cette fonction, je retombe sur mon problème initial :
<?php 
$buteursVotes = array ("papin", "papin", "zidane", "boli");//buteurs votés pour l'équipe A
$buteursReels = array ("papin", "boli");//buteurs réels pour l'équipe A 

$result = array_intersect($buteursVotes, $buteursReels); 
print_r($result); 
?> 
m'affiche deux fois papin alors qu'il me le faut qu'une seule fois :
Array ( [0] => papin [1] => papin [3] => boli )

Posté : 28 juil. 2006, 11:53
par ouckileou
ok, mais là, avec cette fonction, je retombe sur mon problème initial :
Ah oui c'est vrai ça désolé :lol:

Posté : 28 juil. 2006, 11:59
par jay64
Bon, sinon, je tente de me faire un truc moi même.
J'ai donc ça pour l'instant :
<?php
// On initialise les tableaux et les variables
$ButeursDom_Votes = array ("Papin", "Platini", "Boli", "Papin", "Papin");
$ButeursDom_Reels = array ("Ginola", "Papin");
$Points = 0;

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

echo $Points;
?>
Il y a une instruction que je voudrais rajouter dans ce bloc :
{
		echo $ButeursDom_Votes[$v];
		echo $ButeursDom_Reels[$r];				
		$Points = $Points + 1;
		echo "<br />";		
		}
de manière à transformer mon deuxième tableau en lui même MOINS l'occurence qui a déjà été trouvée.

Mais je ne trouve pas la fonction ... ! Une idée ?

Posté : 28 juil. 2006, 12:27
par jpaul
Ca m'énervais alors j'ai fait ça :
$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
  sort($buteursVotes);
  sort($buteursReels);
  echo "<pre>";
  echo "\n\rbuteursVotes : ";
  print_r($buteursVotes);
  echo "\n\rbuteursReels : ";
  print_r($buteursReels);
  echo "</pre>";
  echo "<BR>lecture buteursVotes";
foreach($buteursVotes as $k => $v) {
echo "<BR>".$k." => ".$v." : ".count($$v);
${$v}[count(${$v})]=$v;
$bv[$v.count(${$v})]=$v;
}
// on remet a zero les tableaux utilisés
foreach($buteursVotes as $k => $v) {
unset(${$v});
}
  echo "<BR>lecture buteursReels";
foreach($buteursReels as $k => $v) {
echo "<BR>".$k." => ".$v." : ".count($$v);
${$v}[count(${$v})]=$v;
$br[$v.count(${$v})]=$v;
}
// on a maintenant des des tableaux indexéx [nombut]
  echo "<pre>";
  echo "\n\rbv : ";
  print_r($bv);
  echo "\n\rbr : ";
  print_r($br);
  echo "</pre>";

  echo "<HR>array_intersect_assoc<BR>";
  $result = array_intersect_assoc ($bv, $br);
  print_r($result);
Tu peux peut être simplifier si tu sais directement construire les tableaux :
$br et $bv...

Posté : 28 juil. 2006, 13:47
par ouckileou
Ou ça :
<?php
$buteursVotes = array ("papin", "zidane", "papin", "boli");//buteurs votés pour l'équipe A
$buteursReels = array ("papin", "ginola", "zidane");

echo '<pre>';
// valeurs présentes dans les 2 tableaux
$result = array_intersect($buteursVotes, $buteursReels);
print_r($result);

// suppression des doublons
$result = array_unique($result);
print_r($result);
echo '</pre>';
?>
:)

Posté : 28 juil. 2006, 14:05
par jay64
ok, sauf que là ça coince :
<?php 
$buteursVotes = array ("papin", "zidane", "papin", "boli");//buteurs votés pour l'équipe A 
$buteursReels = array ("papin", "papin", "ginola", "zidane"); 

echo '<pre>'; 
// valeurs présentes dans les 2 tableaux 
$result = array_intersect($buteursVotes, $buteursReels); 
print_r($result); 

// suppression des doublons 
$result = array_unique($result); 
print_r($result); 
echo '</pre>'; 
?> 
car il ne trouve que ça :
Array
(
[0] => papin
[1] => zidane
[2] => papin
)
Array
(
[0] => papin
[1] => zidane
)
alors qu'il me faudrait bien deux fois papin dans cet exemple !

Posté : 28 juil. 2006, 14:06
par jay64
Ca m'énervais alors j'ai fait ça :
$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
  sort($buteursVotes);
  sort($buteursReels);
  echo "<pre>";
  echo "\n\rbuteursVotes : ";
  print_r($buteursVotes);
  echo "\n\rbuteursReels : ";
  print_r($buteursReels);
  echo "</pre>";
  echo "<BR>lecture buteursVotes";
foreach($buteursVotes as $k => $v) {
echo "<BR>".$k." => ".$v." : ".count($$v);
${$v}[count(${$v})]=$v;
$bv[$v.count(${$v})]=$v;
}
// on remet a zero les tableaux utilisés
foreach($buteursVotes as $k => $v) {
unset(${$v});
}
  echo "<BR>lecture buteursReels";
foreach($buteursReels as $k => $v) {
echo "<BR>".$k." => ".$v." : ".count($$v);
${$v}[count(${$v})]=$v;
$br[$v.count(${$v})]=$v;
}
// on a maintenant des des tableaux indexéx [nombut]
  echo "<pre>";
  echo "\n\rbv : ";
  print_r($bv);
  echo "\n\rbr : ";
  print_r($br);
  echo "</pre>";

  echo "<HR>array_intersect_assoc<BR>";
  $result = array_intersect_assoc ($bv, $br);
  print_r($result);
Tu peux peut être simplifier si tu sais directement construire les tableaux :
$br et $bv...
MERCI !!!

Effectivement, ça marche, mais j'arrive pas à tout décortiquer là dedans. Je brainstorm !

Posté : 28 juil. 2006, 14:11
par ouckileou
alors qu'il me faudrait bien deux fois papin dans cet exemple !
Ah ben oui mais ça j'étais pas censé le savoir...

Prends la fonction si elle marche, mais je reste sur l'idée que tout ceci n'est pas très pratique, pour moi le plus logique aurait été d'avoir cette structure :
$tabButeurs = array("nomButeur" => nbButs);
Ainsi tu peux trouver les correspondances sur les noms, et faire facilement un calcul sur la différence Nbre de buts pronostiqués/Nbre de buts marqués :)