2011-01-22 12 views
72

Quiero establecer el valor de una matriz asociativa utilizando el índice de matriz de la pareja clave/valor. Por ejemplo:Acceso a una matriz asociativa por índice entero en PHP

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

¿Cómo se puede lograr esto sin utilizar la cadena de teclas?

Respuesta

155

Use array_keys.

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

Espero que esto ayude.

+2

Funciona como un encanto. Gracias. – Marty

+3

Como nota al margen, ¿por qué los desarrolladores de PHP crearían una forma no intuitiva de acceder a una matriz? – Marty

+1

@Marty esto tiene menos que ver con la forma en que los desarrolladores de PHP lo implementaron, pero más con su falta de comprensión de cómo funcionan las matrices. Técnicamente, lo anterior aún usa el nombre asociativo. No hay correlación entre las claves de índice numérico y asociativo. – Gordon

23

No hay una correlación entre las teclas de índice numérico y asociativo.

Cuando dice que quiere establecer el valor de una matriz asociativa utilizando el índice de la matriz de la clave/valor, entonces usted tiene que utilizar la clave dada, el ajuste $array[1] no es lo mismo que establecer $array['foo'].

consideran este array

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

Esto dará

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

El foo es el segundo elemento de la matriz. Esa es la compensación , pero no tiene nada que ver con el índice 1. Como puede ver, en esa matriz anterior, el índice 1 está asociado con baz. Es incorrecto suponer que solo porque foo es la primera clave asociativa que tiene algo que ver con la clave numérica real 1. Al igual que some no se correlaciona con 2.

Del mismo modo, para una matriz mixta como se muestra arriba, solución con array_keys sugirió otra parte de este sitio no va a funcionar, porque

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

dará

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

Así que cuando lo hace $array[$keys[1]] que realmente está haciendo $array['foo']. Pero si desea acceder al segundo valor asociativo en esa matriz ('some'), no puede hacer $array[$keys[2]] porque eso se evaluaría como $array[1] y eso es baz.

El offset de un elemento tiene relación alguna con su clave o el valor

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

significa realmente

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

lo que significa que el elemento en la posición 0 es foo aunque es clave es 100. Si desea extraer elementos de una matriz por desplazamiento, tiene que utilizar

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

Thi s crearía una matriz que contiene solo el elemento en la tercera posición.

O podría utilizar un ArrayIterator.El ArrayIterator implementa una interfaz Seekable que le permite buscar a una posición específica/posición de la matriz y luego obtener esa:

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

Otra posibilidad es la de convertirlo en una matriz normales:

$ arraybuff = implosión ("~~~", $ my_arr);
$ my_arr = explotar ("~~~", $ arraybuff);

Donde "~~~" es un delimitador que no ocurrirá en sus datos.

Ahora puede acceder a la matriz usando índices numéricos iguales a los desplazamientos.

Si aún necesita conservar su conjunto asociativo, simplemente asígnelo a una variable diferente.

13

Mientras que array_keys() permite el acceso a la enésima clave, array_values le dará el enésimo valor.

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

dará salida 'Dos'.

¿Existe una ventaja de una sobre la otra? Bueno, el único menor que puedo ver es la cantidad de accesos a la matriz.

Con array_keys() que necesita para 3.

  1. obtener las claves de la matriz de datos.
  2. Obtenga la enésima clave de la lista de teclas.
  3. Obtenga el valor con la enésima tecla de la matriz de datos.

Con array_values(), sólo es necesario 2.

  1. obtener los valores de la matriz de datos.
  2. Obtenga el enésimo valor de la lista de valores.

Pero, por otro lado, las claves son normalmente más pequeñas y los datos pueden anidarse enormemente, por lo que, en general, usar el array_keys() es probablemente más seguro.

1

Pruebe esto. Funciona para ti.

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

Tenga cuidado al publicar en un hilo viejo que ya tiene varias respuestas y una respuesta aceptada. Debe explicar por qué su nueva respuesta es mejor que las existentes. – APC

+0

k gracias. @ APC –

1

Si la matriz es grande, tanto array_keys y array_values habrá un desperdicio ya que se asignará una nueva matriz del mismo tamaño que el original, sólo para obtener el enésima clave (o valor).

array_slice acepta un desplazamiento entero y funciona en matrices asociativas. Puede usarlo para obtener (y configurar) la nth clave en tiempo constante.

// 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; 
Cuestiones relacionadas