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 :

Décaler les clés numériques d'un tableau [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut Décaler les clés numériques d'un tableau
    Bonjour.
    Soit par exemple un tableau à 6 éléments à clés numériques de 0 à 5.
    Je veux que la première clé devienne 10 puis la suivante 11, etc sans changer les valeurs.
    Bien sûr, je cherche une solution light, sans avoir à créer un tableau intermédiaire, comme avec array_combine par exemple


    Yves

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Bonsoir, ceci fonctionne...

    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
    <?php
    $data[]=15;
    $data[]=33;
    $data[]=35;
    $data[]=40;
    $data[]=43;
    $data[]=54;
    $nb_rows=count($data);
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    $i=0;
    $decalage=10;
    if($decalage>=$nb_rows){
      do{
         $data[$decalage]=$data[$i];
         $decalage++;
         $i++;
      }while($i<($nb_rows));
      echo '<pre>';
      print_r($data);
      echo '</pre>';
      //ne reste plus qu'à supprimer les n premières lignes
      $data=array_slice($data, $nb_rows, $nb_rows, true);
      echo '<pre>';
      print_r($data);
      echo '</pre>';
    }
    ?>
    Affichera dans l'ordre

    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
    Array
    (
        [0] => 15
        [1] => 33
        [2] => 35
        [3] => 40
        [4] => 43
        [5] => 54
    )
    Array
    (
        [0] => 15
        [1] => 33
        [2] => 35
        [3] => 40
        [4] => 43
        [5] => 54
        [10] => 15
        [11] => 33
        [12] => 35
        [13] => 40
        [14] => 43
        [15] => 54
    )
    Array
    (
        [10] => 15
        [11] => 33
        [12] => 35
        [13] => 40
        [14] => 43
        [15] => 54
    )

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Ou une méthode encore plus simple avec une petite fonction

    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
     
    $data[]=15;
    $data[]=33;
    $data[]=35;
    $data[]=40;
    $data[]=43;
    $data[]=54;
    function reformate_indexes(array $data, $min_index){
      $nb_rows=count($data);
      $i=0;
      if($min_index>=$nb_rows){
        $new_data=array();
        foreach($data as $row){
          $new_data[$min_index+$i]=$row;
          $i++;
        }
      }
      return $new_data;
    }
    $data=reformate_indexes($data, 10);
    echo '<pre>';
    print_r($data);
    echo '</pre>';
    //affiche
    Array
    (
        [10] => 15
        [11] => 33
        [12] => 35
        [13] => 40
        [14] => 43
        [15] => 54
    )

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    je ne vois pas trop pourquoi array_combine() ne ferait-il pas l'affaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $a = range('a', 'f');
    $a = array_combine(range(10, 15), $a);
    tu trouves ça usine à gaz ?

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

    @rawsrc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a = array_combine(range(10, 10+count($a)-1), $a);
    @ypcman
    ...Je veux...
    Ben voyons...

    "Y'en a un peu plus, je vous le mets quand même ??
    Et avec ceci ??..."
    Dernière modification par Invité ; 27/08/2019 à 12h38.

  6. #6
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut
    Bonjour,
    désolé pour ma réponse tardive.
    @jreaux62
    je veux ...
    C'était purement rhétorique, un peu comme un énoncé de pb de maths. Moi, je ne veux rien du tout, j'essaye juste de m'améliorer.
    La difficulté, c'est la taille du tableau > 6000 valeurs. Si je crée un nouveau tableau, je double la taille mémoire allouée. En affinant l'idée de Dentrite, j'ai produit cette petite fonction qui fonctionne bien tout ne doublant pas la taille nécessaire pour obtenir le décalage des clés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function array_key_shift(array &$data, int $shift) {
        if($shift >0) {
          $nb_rows=count($data);
          $array_key_last=array_key_last($data);
          for ($indice = $array_key_last; $indice > $array_key_last - $nb_rows;$indice--) {
              $data[$indice+$shift] = $data[$indice];
              }
           $data = array_reverse(array_slice($data, min($nb_rows,$shift), $nb_rows, true),true);
          }
        }
    J'ai aussi testé avec array_combine mais c'est environ 10% plus lent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       function array_key_shift(array &$data, int $shift) { 
       $array_key_fist=array_key_first($data);
     $data = array_combine(range($array_key_fist+$shift, $array_key_fist+$shift+count($data)-1), $data);   
     }
    Merci beaucoup pour vos idées.

    Yves.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/11/2016, 19h00
  2. Réponses: 9
    Dernier message: 23/05/2012, 20h52
  3. [PHP 5.2] Rétablir les clés numériques d'un tableau
    Par qwertyu dans le forum Langage
    Réponses: 2
    Dernier message: 18/10/2009, 19h17
  4. Réponses: 1
    Dernier message: 15/03/2006, 16h58
  5. [javascript] récupérer les "clés" d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/02/2006, 10h13

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