Comparer 2 tableaux

Eléphant du PHP | 331 Messages

27 juil. 2006, 19:04

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 !

Eléphant du PHP | 331 Messages

28 juil. 2006, 09:31

Allez les amis, un petit coup de pouce SVP ...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 10:53

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

Eléphant du PHP | 451 Messages

28 juil. 2006, 10:57

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 ) 
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, 11:33

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"

Eléphant du PHP | 331 Messages

28 juil. 2006, 11:34

Par contre c'est une fonction PHP5.
Hélas, je suis en PHP 4 !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 11:39

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

Eléphant du PHP | 331 Messages

28 juil. 2006, 11:44

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 )

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 11:53

ok, mais là, avec cette fonction, je retombe sur mon problème initial :
Ah oui c'est vrai ça désolé :lol:

Eléphant du PHP | 331 Messages

28 juil. 2006, 11:59

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 ?

Eléphant du PHP | 451 Messages

28 juil. 2006, 12:27

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...
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, 13:47

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>';
?>
:)

Eléphant du PHP | 331 Messages

28 juil. 2006, 14:05

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 !

Eléphant du PHP | 331 Messages

28 juil. 2006, 14:06

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 !

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

28 juil. 2006, 14:11

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