99 votes

Accéder à un tableau associatif par un indice entier en PHP

Je veux définir la valeur d'un tableau associatif en utilisant l'index du tableau de la paire clé/valeur. Par exemple :

$my_arr = array( "bling" => "some bling", "bling2" => "lots O bling" );
$my_arr[1] = "not so much bling";  // Would change the value with key bling2.

Comment peut-on réaliser cela sans utiliser la chaîne de clés ?

204voto

Donovan Points 1803

Utilice tableau_clés .

$keys = array_keys($my_arr);
$my_arr[$keys[1]] = "not so much bling";

J'espère que cela vous aidera.

4 votes

D'ailleurs, pourquoi les développeurs de PHP ont-ils créé un moyen aussi peu intuitif d'accéder à un tableau ?

3 votes

@Marty cela a moins à voir avec la façon dont les développeurs de PHP l'ont implémenté, mais plus avec votre mauvaise compréhension du fonctionnement des tableaux. Techniquement, l'exemple ci-dessus utilise toujours le nom associatif. Il n'y a aucune corrélation entre les clés d'index numériques et associatives.

2 votes

Vous créez un tableau associatif parce que ce que vous recherchez est plus important que sa position dans le tableau. Je pense que c'est un bon point. Disons que vous avez un tableau avec des noms d'étudiants comme clés et des adresses comme valeurs. Vous pouvez atteindre l'adresse d'un étudiant par son nom. La position dans le tableau n'est pas pertinente. Et vous pouvez trier le tableau par name of the student .

30voto

Gordon Points 156415

Il n'y a pas de corrélation entre les clés d'indexation numériques et associatives.

Quand tu dis que tu veux définir la valeur d'un tableau associatif en utilisant l'index du tableau de la clé/valeur vous devez alors utiliser la clé donnée, en définissant les paramètres suivants $array[1] n'est pas la même chose que de définir $array['foo'] .

Considérez ce tableau

print_r( array('foo', 'foo' => 'bar', 'baz', 'some' => 'value') );

Cela donnera

Array
(
    [0] => foo
    [foo] => bar
    [1] => baz
    [some] => value
)

Le foo est le deuxième élément du tableau. C'est le décalage mais cela n'a rien à voir avec l'indice 1. Comme vous pouvez le voir, dans le tableau ci-dessus, l'indice 1 est associé à baz . Il est faux de supposer que juste parce que foo est la première clé associative qui a quelque chose à voir avec la clé numérique 1. Tout comme some n'est pas en corrélation avec 2.

De même, pour un tableau mixte comme celui présenté ci-dessus, la solution avec array_keys suggéré ailleurs sur ce site ne fonctionnera pas, car

print_r( array_keys(array('foo', 'foo' => 'bar', 'baz', 'some' => 'value')) );

donnera

Array
(
    [0] => 0
    [1] => foo
    [2] => 1
    [3] => some
)

Donc quand vous faites $array[$keys[1]] vous faites vraiment $array['foo'] . Mais si vous voulez accéder à la deuxième valeur associative de ce tableau ( 'some' ), vous ne pouvez pas faire $array[$keys[2]] parce que ce serait évaluer à $array[1] et c'est baz .

Le décalage d'un élément n'est absolument pas lié à sa clé ou à sa valeur.

print_r(
    array(
        100    => 'foo',
        'foo'  => 'bar',
        50     => 'baz',
        'some' => 'value'
    )
);

signifie vraiment

Array
( //key       value     offset/position
    [100]  => foo       // 0
    [foo]  => bar       // 1
    [50]   => baz       // 2
    [some] => value     // 3
)

ce qui signifie que l'élément à l'offset 0 est foo bien que sa clé soit 100. Si vous voulez extraire des éléments d'un tableau par décalage, vous devez utiliser la méthode suivante

$third = array_splice($array, 2, 1);
echo $third[0]; // baz

Cela créerait un tableau contenant uniquement l'élément en troisième position.

Ou vous pouvez utiliser un ArrayIterator . Le site ArrayIterator met en œuvre un Seekable qui vous permet de rechercher une position/un décalage spécifique dans le tableau, puis de le récupérer :

$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current(); // value

1 votes

Petit détail : " si vous voulez accéder à la deuxième valeur associative dans ce tableau ('quelque'), vous ne pouvez pas faire $array[$keys[2]] parce que cela serait évalué à $array[1] et c'est baz" Techniquement, c'est parce que tous Les touches, y compris les touches numériques, sont associatif clés - les 4 valeurs renvoyées par array_keys . Il n'existe pas d'entité telle qu'une "clé non-associative". Si vous vouliez signaler que vous ne pouvez pas renvoyer le 2eme Clé à chaîne (en supposant que le tableau de clés ne contient que des chaînes de caractères), alors ce que vous dites est correct. $stringKeys = array_filter(array_keys($array), "is_string"); donne des clés de chaîne.

22voto

Alors que array_keys() permet d'accéder à la nième touche, array_values vous donnera la nième valeur.

<?php
$array = [
   0     => 'Zero',
   '1'   => 'One',
   'Two' => 'Two',
];
echo array_values($array)[2];
?>

produira le résultat "Deux".

Y a-t-il un avantage de l'un par rapport à l'autre ? Eh bien, le seul avantage mineur que je vois est le nombre d'accès aux tableaux.

Con array_keys() vous devez 3.

  1. Récupère les clés du tableau de données.
  2. Récupère la nième clé de la liste des clés.
  3. Obtenir la valeur de la nième clé du tableau de données.

Con array_values() vous n'en avez besoin que de 2.

  1. Récupère les valeurs du tableau de données.
  2. Récupère la nième valeur de la liste de valeurs.

Mais, d'un autre côté, les clés sont normalement plus petites et les données peuvent être très imbriquées, donc, tout bien considéré, l'utilisation de l'élément array_keys() est probablement plus sûr.

5voto

Jesse Points 633

Si le tableau est grand, les deux array_keys y array_values sera un gaspillage puisqu'il allouera un nouveau tableau de la même taille que l'original, juste pour obtenir l'adresse de l'utilisateur. nième clé (ou valeur).

array_slice accepte un décalage entier et fonctionne sur des tableaux associatifs. Vous pouvez l'utiliser pour obtenir (et définir) l'attribut nième en temps constant.

// This will at most allocate 2 temporary arrays of 1 element each
$key = array_keys(array_slice($array, $n, 1, true))[0];

$array[$key] = $value;

3 votes

Belle solution !

1voto

Murali krishna Points 612

Essayez ceci. Ça marche pour toi.

$result= array_values($my_arr); // Array with indexes you need

1 votes

Veuillez faire attention lorsque vous postez un message dans un ancien fil de discussion qui a déjà reçu plusieurs réponses et une réponse acceptée. Vous devez expliquer pourquoi votre nouvelle réponse est meilleure que les réponses existantes.

0 votes

Je sais que c'est un très vieux commentaire, mais il n'a pas besoin d'être "meilleur". Il doit simplement apporter une valeur ajoutée à ce qui a déjà été fourni.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X