JeuWeb - Crée ton jeu par navigateur

Version complète : doublearray
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Pages : 1 2
Bonjour, j'aimerai pouvoir comprendre comment marche les doubles array.
Ca se présente comme ca :



Code PHP :
<?php $coordonnees = array(=> array('tom','moto'), 2=>array('tom','voiture'), 3=>array('yoan','moto')
); 


Mais...

Dans mon cas précis, imaginons que j'ai des pommes, et des oranges, et que pour faire du jus de fruits, il me faut 10pommes et 3oranges. Comment je fais pour lui dire "if isset(10pommes) AND isset (3orange) = 1fruit"; Mais dans l'array...
Salut, dans ton code il y a une erreur, il manque un index.
Sinon, une simple boucle peut faire l'affaire. Tu parcours ton tableau, et à chaque fois que tu rencontres l'occurrence recherchée tu incrémentes une variable.

Code PHP :
<?php
$array
[] = array('orange');
$array[] = array('orange');
$array[] = array('pomme');
$array[] = array('orange');
$array[] = array('pomme')

$compte['pomme'] = 0;
$compte['orange'] = 0;

foreach (
$array as $ar)
{
    if ( 
in_array($ar'pomme') )
        
$compte['pomme']++;
    elseif( 
in_array($ar'orange') )
        
$compte['orange']++;
}

echo 
'Il y a '.$compte['pomme'].' pomme(s) ';
echo 
'Il y a '.$compte['orange'].' orange(s) ';
?>

Ca affichera "Il y a 2 pomme(s) et 3 orange(s)".

Tu peux aussi faire une solution plus générique, qui compte automatiquement tous les enregistrements de tes tableaux :
Code PHP :
$compte = array();

foreach(
$array as $ar)
{
    foreach (
$ar as $valeur)
    {
        if (!isset(
$compte[$valeur]))
            
$compte[$valeur] = 1;
        else
            
$compte[$valeur]++;
    }
}

foreach (
$compte as $k=>$v)
    echo 
'Il y a '$v' '$k'(s)<br />'
Hummmm, j'explique plus précisément ce que je veux faire 2
Imagine que tu as une usine qui produit des jus de fruits.

Pour 1jus de fruit, il faut SOIT 10tomates, SOIT 4agrumes, etc.

donc j'essaye pour le moment de voir l'occurence par rapport au stock disponible, mais ca ne marche pas...
Code PHP :
$jusfruits = array("pomme" => "10"
"banane" =>"8",
"tomate" =>"12",
"agrumes" =>"5",
"mangue" => "15",
"melon" => "10",
"raisin" =>"20",
"eau" => "15"
);

for (
$numero 0$numero 9$numero++)
{
$stock mysql_query("SELECT SUM(valeur) as valeur FROM c_stock WHERE pays='".$a['paysjoue']."' AND entreprise='".$usines['entreprise']."' AND territoire='".$usines['territoire']."' AND pays='".$usines['pays']."' AND type='".$jusfruits[$numero]."'");
$stocks mysql_fetch_array($stock);

echo 
$stocks['valeur'];


Salut, j'ai du mal à comprendre ce que tu cherches à faire, mais ça commence à rentrer. 2

Tout d'abord, dans ta requête il y a des problèmes.
Elle ne peut pas marcher, premièrement parce que ta clause WHERE, tu exprimes deux conditions pour le champ pays : tu exiges qu'il soit égal à $usines['pays'] et égal à $a['paysjoue']. Ca ne peut marcher que si ces deux variables se valent, puis de toute façon inutile de mettre 2 fois cette condition.
Ensuite, pour comparer des chaines de caractères dans tes conditions, il est préférable d'utiliser LIKE, plutôt que =, qui est réservé aux nombres.

Enfin, plutôt que d'envoyer 9 fois la même requête, tu pourrais l'envoyer une seule fois en modifiant ta condition et en faisant un truc genre
Code :
SELECT .... FROM .... WHERE ... AND (type LIKE "orange" OR type LIKE "pomme"...)

Sinon, pour les problèmes comme ça, je te conseille de décortiquer ton code pour déceler l'erreur. Prends l'habitude d'afficher tes variables pour connaître leur valeur lors de l'exécution du script.
Pense également à afficher les erreurs mysql avec la fonction mysql_error() ( cf php.net pour plus d'infos ), et à afficher tes requêtes.

Pour en revenir à ton problème, a priori rien ne s'affiche, et ça vient clairement de ta requête SQL.
Autre chose, quand tu fais
Code PHP :
AND type='".$jusfruits[$numero]."'" 
ton $jusfruits[$numero] vaut un nombre : 10, 8, 12... Est-ce bien ça que tu veux afficher ? Ou le nom de ton jus de fruit ?
Si tu veux bien afficher ce nombre, tu peux supprimer les guillemets ( ça changera rien mais c'est plus correct ).
Si tu veux afficher le nom des jus de fruit, il faut afficher la clé du tableau et non sa valeur.
Pour cela, il faut utiliser la fonction key :
Code PHP :
key($jusfruits); 
Et il faut déplacer le curseur du tableau à l'enregistrement suivant, sans quoi tu afficherais toujours le même jus de fruit. ça donne :
Code PHP :
key($jusfruits);
next($jusfruits); 

Voilou, t'as de quoi faire 16
Merci, en effet de nombreuses erreurs 2
Une heure que je bloque sur ma requête...trop habitué à faire une requête avec une demande de pays que je ne vois même plus qu'il y en adeux, et deux différents...34

En revanche, les array, toujours aussi compliqué, j'ai rien compris.

Donc je récapitule.
Là j'ai un tableau avec mes différents besoins. 8 pommes, 10agrumes, etc...


Moi ce que je veux, c'est voir combien j'ai en stock de TOUT les fruits possibles, et voir combien de produits je peux produire avec les fruits que j'ai en stock.

Mais du coup ce n'est pas une boucle qu'il faut que j'utilise si ?
Ok j'ai compris !

Alors, il faut que tu comptes le nombre de fruits dans ta table, et que tu groupes les résultats par fruits.
Ca te donnerait une requête du genre :
Code PHP :
'SELECT type, COUNT(type) as nbFruits  FROM ... GROUP By type'
Tu obtiendras, comme résultat :
Code :
type | nbFruits
---------------
orange | 12
pomme | 16
cucurbitace | 6
patate | 9
(ok, y a pas que des fruits, mais c'était pour l'exemple).
Ensuite, il ne te reste plus qu'à confronter ces résultats avec le nombre de fruits requis pour faire un jus.
Si, dans ta table c_stock, tu avais aussi le nombre de fruits requis nb_fruits_requis pour faire un jus, tu aurais pu faire
Code PHP :
'SELECT type, ROUND(COUNT(type)/nb_fruits_requis,0) as nbJus  FROM ... GROUP By type'
Et tu aurais directement le nombre de jus nbJus pour chaque fruits.
je comprend plus rien du tout .....Rhaaaaaaaaaaaa je deviens fou 2

Il suffirait donc, de prendre le nombre de fruits que j'ai en stock, peu importe lequel. De le diviser par les besoins du produit en question.

Mais ? Comment aller chercher dans l'array, les produits nécéssaires ?


Je vais montrer tout le code, ...34
Moi je suis completement perdu, et vraiment l'array, c'est surement tout bête, mais j'y arrive pas.

Code PHP :
<?php $usine mysql_query("SELECT nom FROM c_usine WHERE pays='".$a['paysjoue']."'");
?>
<div id="contenu">
<script type="text/javascript"> 
function chgpage(formulaire)   {    
 if (formulaire.listepages.selectedIndex != 0)       
 location.href = formulaire.listepages.options[formulaire.listepages.selectedIndex].value;   
 } 
 </script> 
 <form>
<select name="listepages" size="1" onChange="chgpage(this.form)"> 
<option selected="selected">Choix de la page</option>
<?php
while($usines mysql_fetch_array($usine))
{
echo 
'<option value="besoinusine.php?usine='.$usines['nom'].'">'.$usines['nom'].'</option>';
}
?>
</select>
</form>

Besoin de l'usine :
<table>
<th>Produit</th><th>Besoins</th><th>stock</th><th>déficit/excedent</th> 
<?php
$besoin 
mysql_query("SELECT type, valeur FROM c_besoin_usine WHERE pays='".$a['paysjoue']."' AND nom='".$_GET['usine']."'");
while(
$besoins mysql_fetch_array($besoin))
{
$usinee mysql_query("SELECT produit,production, territoire, entreprise FROM c_usine WHERE pays='".$a['paysjoue']."' AND nom='".$_GET['usine']."'");
$usinees mysql_fetch_array($usinee);
$stock mysql_query("SELECT valeur FROM c_stock WHERE pays='".$a['paysjoue']."' AND entreprise='".$usinees['entreprise']."' AND territoire='".$usinees['territoire']."' AND type='".$besoins['type']."'");
$stocks mysql_fetch_array($stock);
$difference$stocks['valeur'] - $besoins['valeur'];  

echo 
'<tr><td>'.$besoins['type'].'</td><td>'.$besoins['valeur'].'</td><td>'.$stocks['valeur'].'</td><td>'.$difference.'</td></tr>';

?>
<tr><td>Production : </td><td>
<?php 
echo $usinees['produit'];
echo 
$usinees['production'];
?>





</td><td>production effective :</td><td>
<?php
$fruits 
= array ("noix de coco""tomate""agrumes""mangue""melon""pomme""banane""raisin");}

$jusfruits = array("pomme" => "10"
"banane" =>"8",
"tomate" =>"12",
"agrumes" =>"5",
"mangue" => "15",
"melon" => "10",
"raisin" =>"20",
"eau" => "15"
);

$fruits = array ("noix de coco""tomate""agrumes""mangue""melon""pomme""banane""raisin");

foreach (
$jusfruits as $jus => $quantite)
{
$stock mysql_query("SELECT SUM(valeur) as valeur FROM c_stock WHERE pays='".$a['paysjoue']."' AND entreprise='".$usines['entreprise']."' AND territoire='".$usines['territoire']."' AND pays='".$usines['pays']."' AND type='".$jus."'");
$stocks mysql_fetch_array($stock);

$gu $stocks['valeur']/$quantite;
echo 
$gu;
}



?>
</td>
</table> 
On appel ce genre tableau, des tableaux a 2 dimensions.

Imagine l'array suivant:
Code PHP :
$tab = array(
                
=> array(
                            
'pomme' => 10
                            
'poire' => 2
                        
), 
                
=> array(
                            
'fraise' => 1
                            
'framboise' => 3)
            ); 

Ensuite, PHP gère parfaitement ce genre de tableau, par exemple, je veux le nombre de pomme:
Code PHP :
echo $tab[1]['pomme']; 

Affichera 10.

C'est très pratique pour associé par exemple, l'id d'un jour et c'est caractéristique.

dans le cas ou tu voudrais récupéré pomme, l'utilisation de la fonction array_flip t'aidera car il inversera les clées et les valeurs.

J'espère que cela t'aide.
(02-07-2009 10:37 AM)phenix a écrit : [ -> ]dans le cas ou tu voudrais récupéré pomme, l'utilisation de la fonction array_flip t'aidera car il inversera les clées et les valeurs.

J'espère que cela t'aide.

tout droit sorti de la doc php
    Code PHP
<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>


array_flip est à utiliser avec bon sens; si tu ne peux pas garantir que les valeur sont toutes uniques.. on n'aura plus que la dernière paire "valeur_présente_plusieurs_fois=>clé" au final
Je ferais une remarque sur ton code : tu mélanges complètement le traitement des données et leur affichage. D'une part, ça rend la lecture du code laborieuse, d'autre part quand tu veux mettre les mains dedans tu dois tout éplucher, et tu as de grandes chances de t'y perdre de laisser passer des erreurs pernicieuses. Et quand ton code deviendra plus complexe, ce sera carrément le bordel 11...
Donc, à défaut d'utiliser un système de template, ce serait bien si au moins, tu mettais tout le code php en haut, et le reste en bas.

Par exemple, au lieu de faire ça :
Code PHP :
<?php $usine mysql_query("SELECT nom FROM c_usine WHERE pays='".$a['paysjoue']."'");
?>
<div id="contenu">
<script type="text/javascript"> 
function chgpage(formulaire)   {    
 if (formulaire.listepages.selectedIndex != 0)       
 location.href = formulaire.listepages.options[formulaire.listepages.selectedIndex].value;   
 } 
 </script> 
 <form>
<select name="listepages" size="1" onChange="chgpage(this.form)"> 
<option selected="selected">Choix de la page</option>
<?php
while($usines mysql_fetch_array($usine))
{
echo 
'<option value="besoinusine.php?usine='.$usines['nom'].'">'.$usines['nom'].'</option>';
}
?>
</select>
</form> 

Tu devrais faire ça :
Code PHP :
<?php 

// Liste des usines
$usine mysql_query("SELECT nom FROM c_usine WHERE pays='".$a['paysjoue']."'");
$listUsines '';
while(
$usines mysql_fetch_array($usine))
{
    
$listUsines .= '<option value="besoinusine.php?usine='.$usines['nom'].'">'.$usines['nom'].'</option>';
}

?>
<div id="contenu">
<script type="text/javascript"> 
function chgpage(formulaire)   {    
 if (formulaire.listepages.selectedIndex != 0)       
 location.href = formulaire.listepages.options[formulaire.listepages.selectedIndex].value;   
 } 
 </script> 
 <form>
<select name="listepages" size="1" onChange="chgpage(this.form)"> 
    <option selected="selected">Choix de la page</option>
    <?php echo $listUsines?>
</select>
</form> 

Avant de t'attaquer au dit problème des jus de fruits, tu devrais réorganiser un peu tout ça, et réfléchir sérieusement à l'utilisation de templates ( lien vers un tuto sur une classe template simple d'utilisation ).

Autre chose, tu peux remplacer cette ligne :
Code PHP :
$fruits = array ("noix de coco""tomate""agrumes""mangue""melon""pomme""banane""raisin");} 
par :
Code PHP :

Tu déclares le tableau fruits un peu plus loin, inutile de le déclarer / redéclarer dans ta boucle ( d'autant plus que cette variable n'est pas utilisée dans ta boucle ).

Ensuite, je pense que le problème vient toujours de ta requête. Pour info, tu as toujours deux fois la condition qui porte sur le champ pays...
Donc pour essayer de déterminer la cause du problème, affiche des infos utiles, remplaçe ça :
Code PHP :
foreach ($jusfruits as $jus => $quantite)
{
$stock mysql_query("SELECT SUM(valeur) as valeur FROM c_stock WHERE pays='".$a['paysjoue']."' AND entreprise='".$usines['entreprise']."' AND territoire='".$usines['territoire']."' AND pays='".$usines['pays']."' AND type='".$jus."'");
$stocks mysql_fetch_array($stock);

$gu $stocks['valeur']/$quantite;
echo 
$gu;


par
Code PHP :
foreach ($jusfruits as $jus => $quantite)
{
    
// On met la requête dans une variable
    
$query "SELECT SUM(valeur) as valeur FROM c_stock WHERE pays='".$a['paysjoue']."' AND entreprise='".$usines['entreprise']."' AND territoire='".$usines['territoire']."' AND pays='".$usines['pays']."' AND type='".$jus."'";

    
// On envoie la requête, et si elle ne marche pas on arrête le script, on affiche l'erreur mysql, et la requête.
    
$stock mysql_query($query) or die(mysql_error()."<br /> $query");
    
$stocks mysql_fetch_array($stock);
    
    
// Si on a passé l'étape précédente, on affiche le résultat de la requête, pour voir ce qui s'y trouve.
    
var_dump($stocks);
    
//$gu = $stocks['valeur']/$quantite;
    //echo $gu;

fonction mysql_error() - fonction die()

Bon courage 2
Pages : 1 2
URLs de référence