IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Manipulation délicate d'un tableau


Sujet :

Langage PHP

  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Manipulation délicate d'un tableau
    Bonjour à Tous,

    J'ai manipulé ce tableau dans tous les sens, crée des indices qui s'incrémentent dans les boucles etc...je sèche.

    Le tableau de travail :

    Array
    (
    [0] => Array
    (
    [etat] => 0
    [poids] => 122
    )

    [1] => Array
    (
    [etat] => 0
    [poids] => 113
    )

    [2] => Array
    (
    [etat] => 1
    [poids] => 5
    )

    [3] => Array
    (
    [etat] => 1
    [poids] => 96
    )

    [4] => Array
    (
    [etat] => 1
    [poids] => 9
    )

    [5] => Array
    (
    [etat] => 1
    [poids] => 8
    )

    )
    Mon but: transformer ce tableau en tenant compte du critère suivant: si la clef "etat" à la valeur 0, alors la clef "poids" a aussi la valeur 0. Mais dès que "etat" passe à 1, alors "poids" prend la valeur de départ égale au nombre de tours où "etat" est à 0 et s'incrémente de 1....pas clair ?
    Le tableau voulu :

    Array
    (
    [0] => Array
    (
    [etat] => 0
    [poids] => 0 //poids vaut etat car égale à 0
    )

    [1] => Array
    (
    [etat] => 0
    [poids] => 0 // idem
    )

    [2] => Array
    (
    [etat] => 1
    [poids] => 2 // après 2 passages avec "etat" valeur 0, "poids" vaut 2
    )

    [3] => Array
    (
    [etat] => 1
    [poids] => 3
    )

    [4] => Array
    (
    [etat] => 1
    [poids] => 4
    )

    [5] => Array
    (
    [etat] => 1
    [poids] => 5
    )

    )
    Merci d'avance à ceux qui voudront bien se pencher sur ce qui est, pour moi, un casse tête...

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    tes explications contredisent ton exemple...
    Mais dès que "etat" passe à 1, alors "poids" prend la valeur de départ égale au nombre de tours où "etat" est à 0 et s'incrémente de 1
    Dans ton exemple : pour etat à 1 et poids 9 tu retombes sur un poids à 4 alors que le nombre de tours ou etat est à zéro est de toujours de 2...

    Bref, voici le code qui suit ton exemple et pas tes explications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    $data = [
        0 => [
            'etat' => 0,
            'poids' => 122
        ],
        1 => [
            'etat' => 0,
            'poids' => 113
        ],
        2 => [
            'etat' => 1,
            'poids' => 5
        ],
        3 => [
            'etat' => 1,
            'poids' => 96
        ],
        4 => [
            'etat' => 1,
            'poids' => 9
        ],
        5 => [
            'etat' => 1,
            'poids' => 8
        ]
    ];
     
    $i = 0;
    foreach ($data as &$v)
    {
        if ($v['etat'] === 0)
        {
            $v['poids'] = 0;
            ++$i;
        }
        elseif ($v['etat'] === 1)
        {
            $v['poids'] = $i++;
        }
    }

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Par défaut
    C'est pas très clair comme explication

    j'ai compris ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?php
    $data = [
    	0 => [
    		'etat' => 0,
    		'poids' => 122
    	],
    	1 => [
    		'etat' => 0,
    		'poids' => 113
    	],
    	2 => [
    		'etat' => 0,
    		'poids' => 5
    	],
    	3 => [
    		'etat' => 1,
    		'poids' => 96
    	],
    	4 => [
    		'etat' => 1,
    		'poids' => 9
    	],
    	5 => [
    		'etat' => 1,
    		'poids' => 8
    	]
    ];
     
    function traitement($tab) {
    	for ($i=0;$i<count($tab);$i++) {
    // on ajoute une cle au tableau pour compter le nombre de passage a 0
    		if (!array_key_exists('compteur',$tab[$i])) {
    			$tab[$i]['compteur'] = 0;
    		}
    		if (0 === $tab[$i]['etat'])	{
    			$tab[$i]['poids'] = 0; 
    			$tab[$i]['compteur']++;
    		}
    		if (1 === $tab[$i]['etat'] && $tab[$i]['compteur'] > 0)	{
    			$tab[$i]['poids'] = $tab[$i]['compteur'];
    			$tab[$i]['compteur'] = 0;
    		}
    	}
    	return $tab;
    } 
     
    print_r($data);
    echo "<hr>";
    $data = traitement($data);
    print_r($data);
    echo "<hr>";
    $data = traitement($data);
    print_r($data);
    echo "<hr>";
    $data[2]['etat']=1;
    $data = traitement($data);
    print_r($data);
    ?>

  4. #4
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour à Tous et merci

    Hummm, pas simple à expliquer, en fait.

    Array
    (
    [0] => Array
    (
    [etat] => 0
    [poids] => 122
    )

    [1] => Array
    (
    [etat] => 0
    [poids] => 113
    )

    [2] => Array
    (
    [etat] => 1
    [poids] => 5
    )

    [3] => Array
    (
    [etat] => 1
    [poids] => 96
    )

    [4] => Array
    (
    [etat] => 1
    [poids] => 9
    )

    [5] => Array
    (
    [etat] => 1
    [poids] => 8
    )

    )
    Dans mon tableau de départ, il y a 2 clés avec etat=0. Donc pour ces 2 clés, poids doit passer à 0.
    Et pour la 3ème clé, poids vaut 2 (puisque avant il y a 2 clés à etat=0)
    Ensuite poids doit s'incrémenter de 1, ce qui donne :

    Array
    (
    [0] => Array
    (
    [etat] => 0
    [poids] => 0 //poids passe à 0 car etat vaut 0
    )

    [1] => Array
    (
    [etat] => 0
    [poids] => 0 // idem précédent
    )

    [2] => Array
    (
    [etat] => 1 // ici etat vaut 1 pour la première fois
    [poids] => 2 // après 2 passages avec "etat" valeur 0, "poids" vaut 2. Si on avait 5 clés avec etat=0, poids devrait valoir 5
    )

    [3] => Array
    (
    [etat] => 1
    [poids] => 3 // poids s'incrémente de 1 par rapport à valeur de poids précédente
    )

    [4] => Array // idem etc...
    (
    [etat] => 1
    [poids] => 4
    )

    [5] => Array
    (
    [etat] => 1
    [poids] => 5
    )

    )
    Je vais travailler sur vos propositions et je reviens.
    Bonne journée et encore merci.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    122, 113,... les valeurs initiales de poids n'ont donc aucune importance ?

    on constate que pour chaque index :
    • si etat=0 -> poids=0
    • sinon poids=index


    On a donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach( $data as $key => $val )
    {
      $val['poids'] = ($val['etat']==0)? 0 : $key;
    }
    En effet, super délicat...
    Dernière modification par Invité ; 09/04/2016 à 10h03.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut l'ami jreaux62

    Je l'avais remarqué mais connaissant le collègue renaud26 je me suis que c'est juste un cas particulier de l'exemple présenté et j'ai opté d'ignorer cette spécificité.
    Il faudrait pour bien faire qu'il présente plusieurs cas de figure des données d'entrée avec le résultat escompté en sortie.

  7. #7
    Invité
    Invité(e)
    Par défaut Delicatessen
    tout-à-fait d'accord, ami rawsrc

    attendons le prochaine exemple, plein de délicatesse

  8. #8
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Ouais bon...

    Je me suis embrouillé la tête et j'ai cherché midi à quatorze heures.
    Fait pas bon vieillir.
    Désolé du dérangement et bon week end.
    Et merci à tous. Je sors sur la pointe des pieds et j'éteins la lumière.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipulation de pointeur sur tableau dynamique
    Par vincenet dans le forum Débuter
    Réponses: 12
    Dernier message: 09/12/2014, 17h53
  2. [PHP 5.3] Manipulation de string et tableau à dimension fixe
    Par pierricktpt dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2012, 15h12
  3. [PHP-JS] Manipuler en Javascript un tableau dans un formulaire PHP
    Par Bouillons2 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/11/2010, 10h10
  4. aide manipulation tableau de int
    Par capone dans le forum C++
    Réponses: 4
    Dernier message: 30/01/2006, 11h55
  5. Manipulation de tableau
    Par BoBy9 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 22/01/2006, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo