[RESOLU] Préserver les clés numériques d'un tableau lors d'une suppression d'une ligne ou colonne.

Oazis
Invité n'ayant pas de compte PHPfrance

08 juin 2016, 13:08

Bonjour,

Heureux d'être parmi vous :) ma question est la suivante:
Comment préserver les clés numériques d'un tableau après avoir supprimer une colonne de ce tableau?
Pour résumer je ne veux pas que les clés ce ré-indexe automatiquement?

J'ai utilisé la fonction array_splice pour la suppression.

Merci d'avance :)

Eléphant du PHP | 176 Messages

08 juin 2016, 13:40

Bonjour Oazis,

Tu as deux cas possibles:

1. Setter la valeur de ta clé à null :

Code

Code : Tout sélectionner

$array = array("test1","test2","test3"); $array[1] = NULL; var_dump($array);
Résultat

Code : Tout sélectionner

array (size=2) 0 => string 'test1' (length=5) 1 => null 2 => string 'test3' (length=5)
La clé est conservée mais pas la valeur.

2. Unset la colonne :

Code

Code : Tout sélectionner

$array = array("test1","test2","test3"); unset($array[1]);
Résultat

Code : Tout sélectionner

array (size=2) 0 => string 'test1' (length=5) 2 => string 'test3' (length=5)
Ni la clé, ni la valeur ne sont conservé mais les indexes ne sont pas modifiés
Cordialement
Naroth

Oazis
Invité n'ayant pas de compte PHPfrance

08 juin 2016, 15:43

Merci pour ta réponse Naroth,

mais j'ai oublié de préciser que je travail avec un tableau multidimensionnel.
Donc la méthode avec le unset fonctionnerait pour supprimer plusieurs lignes en même temps?
Comment doit-je différencier les lignes des colonnes lors de la suppression?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 juin 2016, 16:01

Les tableaux php ne sont pas des tableaux à proprement parler, en tout cas pas comme sous excel où tu as des lignes et des colonnes. Les tableaux php sont en fait des arbres. Tu auras donc un premier niveau (qui peut éventuellement correspondre à tes colonnes), qui contiendra des valeurs ou d'autres arbres/tableaux et ainsi de suite.

SI on compare a du Excel, on a un tableau à 2 dimensions (lignes et colonnes) que l'on pourrait traduire ainsi :
$tableau = array (
  'A' => array (
      1 => 'Cellule A1',
      2 => 'Cellule A2',
      3 => 'Cellule A3'
  ),
  'B' => array (
      1 => 'Cellule B1',
      2 => 'Cellule B2',
      3 => 'Cellule B3'
  )
);
Pour accéder à la colonne B on ferait appel à $tableau['B'] (on obtiens alors toutes les cellules) et pour avoir la cellule B2 on ferait appel à $tableau['B'][2].
Tu peux ainsi supprimer une colonne entière avec unset($tableau['B']) ou juste une cellule avec unset($tableau['B'][2])

Dans mon exemple, j'ai commencé avec les colonnes puis les lignes, mais on peut tout aussi bien imaginer le faire dans l'autre sens pour accéder aux colonnes d'une même ligne.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 176 Messages

08 juin 2016, 16:15

Le unset fonction également avec un tableau multidimensionnel.

Code

Code : Tout sélectionner

$array = array( array( "test00", "test01", "test02", ), array( "test10", "test11", "test12", ),array( "test20", "test21", "test22", ), );
Affichage

Code : Tout sélectionner

array (size=3) 0 => array (size=3) 0 => string 'test00' (length=6) 1 => string 'test01' (length=6) 2 => string 'test02' (length=6) 1 => array (size=3) 0 => string 'test10' (length=6) 1 => string 'test11' (length=6) 2 => string 'test12' (length=6) 2 => array (size=3) 0 => string 'test20' (length=6) 1 => string 'test21' (length=6) 2 => string 'test22' (length=6)

Dans mon cas :

Code : Tout sélectionner

unset($array[1]);
Affichage

Code : Tout sélectionner

array (size=2) 0 => array (size=3) 0 => string 'test00' (length=6) 1 => string 'test01' (length=6) 2 => string 'test02' (length=6) 2 => array (size=3) 0 => string 'test20' (length=6) 1 => string 'test21' (length=6) 2 => string 'test22' (length=6)
Si tu veux supprimer "test12" par exemple :

Code

Code : Tout sélectionner

unset($array[1][2]);
Affichage

Code : Tout sélectionner

array (size=3) 0 => array (size=3) 0 => string 'test00' (length=6) 1 => string 'test01' (length=6) 2 => string 'test02' (length=6) 1 => array (size=2) 0 => string 'test10' (length=6) 1 => string 'test11' (length=6) 2 => array (size=3) 0 => string 'test20' (length=6) 1 => string 'test21' (length=6) 2 => string 'test22' (length=6)
Cordialement
Naroth

Eléphanteau du PHP | 29 Messages

08 juin 2016, 16:35

Merci Ryle cela me semble plus claire maintenant :)

Cela fonctionne très bien Naroth mais maintenant si j'ai envie de placer le unset dans une boucle for comment cela fonctionne?
for ($i=0; $i <count($valCol) ; $i++) {
echo $valCol[$i];

unset($tab[$valCol[$i]]);
}
Avec
$valCol=[1,2,3]
et
$tab= Array ( [nom] => Array ( [0] => Aziz [1] => Adel [2] => Brayan [3] => Eric ) 
               [a] => Array ( [0] => 1 [1] => 2 [2] => 6 [3] => 7 ) 
               [b] => Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 4 ) 
               [c] => Array ( [0] => 3 [1] => 9 [2] => 7 [3] => 5 ) 
               [d] => Array ( [0] => 2 [1] => 5 [2] => 8 [3] => 7 ) )
Je veux ici supprimer les lignes a, b et c.

Mais ça ne fonctionne pas :?:

Eléphant du PHP | 176 Messages

08 juin 2016, 16:58

Pour que cela puisse fonctionner tu dois avoir
Si tu décides que la colonne s'appelle "a", tu ne pourras accéder à cet élément que par la lettre "a"

Code : Tout sélectionner

[a] => Array ( [0] => 1 [1] => 2 [2] => 6 [3] => 7 )
De ce fait valCol doit être :

Code : Tout sélectionner

$valCol=["a","b","c"]
Modifié en dernier par Naroth le 08 juin 2016, 17:22, modifié 1 fois.
Cordialement
Naroth

Eléphanteau du PHP | 29 Messages

08 juin 2016, 17:08

Et si je veux supprimer les colonnes 1, 2 et 3 comment je procéderais?

Eléphant du PHP | 176 Messages

08 juin 2016, 17:09

Est-ce que pour toi "a" est la colonne 1, "b" la colonne 2, etc... ?
Cordialement
Naroth

Eléphanteau du PHP | 29 Messages

08 juin 2016, 17:17

Non ce sont des lignes

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 juin 2016, 17:17

Si a,b,c... sont tes lignes et 1,2,3 ... tes colonnes :
- pour supprimer une ligne il suffit de faire unset($tab['leNomDeLaLigne']) et toute les colonnes de cette ligne seront supprimées.
- pour supprimer une colonne, il faut la supprimer dans chacune des lignes. Il faut donc boucler sur tes lignes et faire un unset($tab['leNomDeLaLigne']['leNomDeLaColonne'])

Donc pour supprimer la ligne C :
unset($tab['c']);
Et pour supprimer la colonne 2 de chacune des lignes :
foreach ($tab as $ligne => $colonnes) {
  unset($tab[$ligne]['2']);
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 176 Messages

08 juin 2016, 17:28

Autant pour moi.

Et du coup Ryle a raison.
Si tu souhaites supprimer les colonnes 1,2,3 de tes lignes à l'aide de

Code : Tout sélectionner

$valCol=[1,2,3]
tu va devoir faire un double foreach

Code : Tout sélectionner

foreach($tab as $ligne => $colonnes) { foreach($valCol as $col) { unset($tab[$ligne][$col]); } }
Cordialement
Naroth

Eléphanteau du PHP | 29 Messages

08 juin 2016, 17:48

Merci de votre aide :)

Eléphanteau du PHP | 29 Messages

09 juin 2016, 09:57

Bonjour c'est encore moi,

j'ai encore une dernière question, si mon tableau est disposé comme ci-dessous comment je devrais m'y prendre pour supprimer plusieurs lignes?
$tab= Array ( [0] => Array ( [0] => a [1] => b [2] => c [3] => d ) 
              [1] => Array ( [0] => 1 [1] => 2 [2] => 6 [3] => 7 ) 
              [2] => Array ( [0] => 0 [1] => 3 [2] => 5 [3] => 4 ) 
              [3] => Array ( [0] => 3 [1] => 9 [2] => 7 [3] => 5 ) 
              [4] => Array ( [0] => 2 [1] => 5 [2] => 8 [3] => 7 ) )
Admettons qu'au lieu d'avoir $valCol j'ai $valRow
$valRow=[0,2,4];
Merci

Eléphanteau du PHP | 29 Messages

09 juin 2016, 10:39

C'est bon j'ai trouvé merci quand même :)