Saltar al contenido

¿Cómo puedo acceder a un array/¿objeto?

Después de de esta prolongada búsqueda de datos dimos con la solución este enigma que pueden tener muchos los usuarios. Te regalamos la respuesta y nuestro deseo es resultarte de gran apoyo.

Solución:

Para acceder a un array o object cómo utilizar dos operadores diferentes.

Matrices

Acceder array elementos que tienes que usar [] o que no ve mucho, pero que también puede usar es .

echo $array[0];
echo $array0;
//Both are equivalent and interchangeable

Diferencia entre declarar un array y accediendo a un array elemento

Definiendo un array y accediendo a un array elemento son dos cosas diferentes. Así que no los confunda.

Para definir un array puedes usar array() o para PHP> = 5.4 [] y asigna / establece un array/-elemento. Mientras accede a un array elemento con [] o como se mencionó anteriormente, obtienes el valor de un array elemento opuesto al establecimiento de un elemento.

//Declaring an array
$arrayA = array ( /*Some stuff in here*/ );
$arrayB = [ /*Some stuff in here*/ ]; //Only for PHP >=5.4

//Accessing an array element
echo $array[0];
echo $array0;

Acceso array elemento

Para acceder a un elemento particular en un array puedes usar cualquier expresión dentro [] o que luego se evalúa a la key quieres acceder:

$array[(Any expression)]

Así que tenga en cuenta la expresión que usa como key y cómo es interpretado por PHP:

echo $array[0];            //The key is an integer; It accesses the 0's element
echo $array["0"];          //The key is a string; It accesses the 0's element
echo $array["string"];     //The key is a string; It accesses the element with the key 'string'
echo $array[CONSTANT];     //The key is a constant and it gets replaced with the corresponding value
echo $array[cOnStAnT];     //The key is also a constant and not a string
echo $array[$anyVariable]  //The key is a variable and it gets replaced with the value which is in '$anyVariable'
echo $array[functionXY()]; //The key will be the return value of the function

Acceso multidimensional array

Si tiene varias matrices entre sí, simplemente tiene un multidimensional array. Para acceder a un array elemento en un sub array solo tienes que usar múltiples [].

echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"]
         // ├─────────────┘  ├──────────────┘  ├────────────────────────────┘
         // │                │                 └── 3rd Array dimension;
         // │                └──────────────────── 2d  Array dimension;
         // └───────────────────────────────────── 1st Array dimension;

Objetos

Para acceder a la propiedad de un objeto, debe usar ->.

echo $object->property;

Si tiene un objeto en otro objeto, solo tiene que usar múltiples -> para llegar a la propiedad de su objeto.

echo $objectA->objectB->property;

Nota:

  1. ¡También debe tener cuidado si tiene un nombre de propiedad que no es válido! Entonces, para ver todos los problemas que puede enfrentar con un nombre de propiedad no válido, consulte esta pregunta / respuesta. Y especialmente este si tiene números al comienzo del nombre de la propiedad.

  2. Solo puede acceder a propiedades con visibilidad pública desde fuera de la clase. De lo contrario (privado o protegido) necesita un método o reflexión, que puede utilizar para obtener el valor de la propiedad.

Matrices y objetos

Ahora, si tienes matrices y objetos mixed el uno en el otro solo tienes que mirar si ahora accedes a un array elemento o una propiedad de objeto y use el operador correspondiente para ello.

//Object
echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property;
    //├────┘  ├───────────┘  ├───────────┘ ├──────────────────────┘   ├──────┘
    //│       │              │             │                          └── property ; 
    //│       │              │             └───────────────────────────── array element (object) ; Use -> To access the property 'property'
    //│       │              └─────────────────────────────────────────── array (property) ; Use [] To access the array element 'elementOneWithAnObject'
    //│       └────────────────────────────────────────────────────────── property (object) ; Use -> To access the property 'propertyArray'
    //└────────────────────────────────────────────────────────────────── object ; Use -> To access the property 'anotherObject'


//Array
echo $array["arrayElement"]["anotherElement"]->object->property["element"];
    //├───┘ ├────────────┘  ├──────────────┘   ├────┘  ├──────┘ ├───────┘
    //│     │               │                  │       │        └── array element ; 
    //│     │               │                  │       └─────────── property (array) ; Use [] To access the array element 'element'
    //│     │               │                  └─────────────────── property (object) ; Use -> To access the property 'property'
    //│     │               └────────────────────────────────────── array element (object) ; Use -> To access the property 'object'
    //│     └────────────────────────────────────────────────────── array element (array) ; Use [] To access the array element 'anotherElement'
    //└──────────────────────────────────────────────────────────── array ; Use [] To access the array element 'arrayElement'

Espero que esto le dé una idea aproximada de cómo puede acceder a matrices y objetos, cuando están anidados entre sí.

Nota:

  1. Si se llama array u objeto depende de la parte más externa de su variable. Entonces [new StdClass] es un array incluso si tiene objetos (anidados) dentro de él y $object->property = array(); es un objeto incluso si tiene matrices (anidadas) en su interior.

    Y si no está seguro de si tiene un objeto o array, Solo usa gettype().

  1. No se confunda si alguien usa un estilo de codificación diferente al suyo:

    //Both methods/styles work and access the same data
    echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property;
    echo $object->
            anotherObject
            ->propertyArray
            ["elementOneWithAnObject"]->
            property;
    
    //Both methods/styles work and access the same data
    echo $array["arrayElement"]["anotherElement"]->object->property["element"];
    echo $array["arrayElement"]
         ["anotherElement"]->
             object
       ->property["element"];
    

Matrices, objetos y bucles

Si no solo desea acceder a un solo elemento, puede recorrer su anidado array / objeto y revise los valores de una dimensión particular.

Para esto, solo tiene que acceder a la dimensión sobre la que desea realizar un bucle y luego puede recorrer todos los valores de esa dimensión.

Como ejemplo, tomamos un array, pero también podría ser un objeto:

Array (
    [data] => Array (
            [0] => stdClass Object (
                    [propertyXY] => 1
                )    
            [1] => stdClass Object (
                    [propertyXY] => 2
                )   
            [2] => stdClass Object (
                    [propertyXY] => 3                   
               )    
        )
)

Si recorre la primera dimensión, obtendrá todos los valores de la primera dimensión:

foreach($array as $key => $value)

Significa que aquí, en la primera dimensión, solo tendría 1 elemento con la key($key) data y el valor ($value):

Array (  //Key: array
    [0] => stdClass Object (
            [propertyXY] => 1
        )
    [1] => stdClass Object (
            [propertyXY] => 2
        )
    [2] => stdClass Object (
            [propertyXY] => 3
        )
)

Si recorre la segunda dimensión, obtendrá todos los valores de la segunda dimensión:

foreach($array["data"] as $key => $value)

Significa que aquí en la segunda dimensión tendrías 3 elementos con el keys($key) 0, 1, 2 y los valores ($value):

stdClass Object (  //Key: 0
    [propertyXY] => 1
)
stdClass Object (  //Key: 1
    [propertyXY] => 2
)
stdClass Object (  //Key: 2
    [propertyXY] => 3
)

Y con esto puede recorrer cualquier dimensión que desee sin importar si es un array u objeto.

Analizar var_dump() / print_r() / var_export() producción

Todas estas 3 funciones de depuración generan los mismos datos, solo en otro formato o con algunos metadatos (por ejemplo, tipo, tamaño). Entonces, aquí quiero mostrar cómo debe leer el resultado de estas funciones para saber / llegar a la forma de acceder a ciertos datos desde su array/objeto.

Aporte array:

$array = [
    "key" => (object) [
        "property" => [1,2,3]
    ]
];

var_dump() producción:

array(1) 
  ["key"]=>
  object(stdClass)#1 (1) 
    ["property"]=>
    array(3) 
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    
  

print_r() producción:

Array
(
    [key] => stdClass Object
        (
            [property] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

        )

)

var_export() producción:

array (
  'key' => 
  stdClass::__set_state(array(
     'property' => 
    array (
      0 => 1,
      1 => 2,
      2 => 3,
    ),
  )),
)

Como puede ver, todas las salidas son bastante similares. Y si ahora desea acceder al valor 2, puede comenzar desde el valor en sí, al que desea acceder, y avanzar hacia la “parte superior izquierda”.

1. Primero vemos que el valor 2 está en un array con el key 1

array(3)   //var_dump()
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)

Array  //print_r()
(
  [0] => 1
  [1] => 2
  [2] => 3
)

array (  //var_export()
  0 => 1,
  1 => 2,
  2 => 3,
),

Esto significa que tenemos que usar []/ para acceder al valor 2 con [1], ya que el valor tiene el key/ índice 1.

2. A continuación, vemos que el array se asigna a una propiedad con el nombre de propiedad de un objeto

object(stdClass)#1 (1)   //var_dump()
  ["property"]=>
    /* Array here */

stdClass Object  //print_r()
([property] => /* Array here */
)

stdClass::__set_state(array(  //var_export()
  'property' => 
    /* Array here */
)),

Esto significa que tenemos que usar -> para acceder a la propiedad del objeto, p. ej. ->property.

Así que hasta ahora sabemos que tenemos que usar ->property[1].

3. Y al final vemos que el más externo es un array

array(1)   //var_dump()
  ["key"]=>
    /* Object & Array here */

Array  //print_r()
([key] => 
    /* Object & Array here */
)

array (  //var_export()
  'key' =>
    /* Object & Array here */
)

Como sabemos que tenemos que acceder a un array elemento con [], vemos aquí que tenemos que usar ["key"] para acceder al objeto. Ahora podemos juntar todas estas partes y escribir:

echo $array["key"]->property[1];

Y la salida será:

2

¡No dejes que PHP te engañe!

Hay algunas cosas que debes saber para no pasar horas buscándolas.

  1. Caracteres “ocultos”

    A veces tienes personajes en tu keys, que no se ve a primera vista en el navegador. Y luego se pregunta por qué no puede acceder al elemento. Estos caracteres pueden ser: pestañas (t), nuevas líneas (n), espacios o etiquetas html (p. ej.

    , ), etc.

    Como ejemplo, si observa la salida de print_r() y ves:

    Array ( [key] => HERE ) 
    

    Entonces estás intentando acceder al elemento con:

    echo $arr["key"];
    

    Pero está recibiendo el aviso:

    Aviso: índice indefinido: key

    Esta es una buena indicación de que debe haber algunos caracteres ocultos, ya que no puede acceder al elemento, incluso si el keys parece bastante correcto.

    El truco aquí es usar var_dump() + ¡mira tu código fuente! (Alternativa: highlight_string(print_r($variable, TRUE));)

    Y, de repente, tal vez veas cosas como esta:

    array(1) 
      ["
    key"]=>
      string(4) "HERE"
    
    

    Ahora verás que tu key tiene una etiqueta html + un carácter de nueva línea, que no viste en primer lugar, ya que print_r() y el navegador no mostró eso.

    Así que ahora, si intentas hacer:

    echo $arr["nkey"];
    

    Obtendrá la salida deseada:

    HERE
    
  2. Nunca confíes en la salida de print_r() o var_dump() si miras XML

    Puede tener un archivo XML o string cargado en un objeto, p. ej.

     
     
         
            test 
         
    
    

    Ahora si usas var_dump() o print_r() ya verás:

    SimpleXMLElement Object
    (
        [item] => SimpleXMLElement Object
        (
            ¿Cómo puedo acceder a un array/¿objeto?
     => test
        )
    
    )
    

    Entonces, como puede ver, no ve el attributes del título. Entonces, como dije, nunca confíes en la salida de var_dump() o print_r() cuando tienes un objeto XML. Siempre usa asXML() para ver el archivo XML completo /string.

    Así que usa uno de los métodos que se muestran a continuación:

    echo $xml->asXML();  //And look into the source code
    
    highlight_string($xml->asXML());
    
    header ("Content-Type:text/xml");
    echo $xml->asXML();
    

    Y luego obtendrás el resultado:

    
     
         
            test 
         
    
    

Para más información, ver:

General (símbolos, errores)

  • Referencia – ¿Qué significa este símbolo en PHP?
  • Referencia – ¿Qué significa este error en PHP?
  • Errores de sintaxis / análisis de PHP; y ¿Cómo solucionarlos?

Problemas con el nombre de la propiedad

  • ¿Cómo puedo acceder a una propiedad con un nombre no válido?
  • ¿Cómo acceder a las propiedades de los objetos con nombres como números enteros?

De la pregunta no podemos ver la estructura de la entrada. array. Puede ser array ('id' => 10499478683521864, 'date' => '07/22/1983'). Entonces, cuando pregunte $ demo[0] usas undefind index.

Array_values ​​perdidos keys y volver array con numerosos keys haciendo array como array(10499478683521864, '07/22/1983'...). Este resultado lo vemos en la pregunta.

Entonces, puedes tomar un array valores de artículo de la misma manera

echo array_values($get_user)[0]; // 10499478683521864 

Si su salida de print_r($var) es por ejemplo:

    Array ( [demo] => Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] ) )

entonces hazlo $var['demo'][0]

Si la salida de print_r($var) es por ejemplo:

    Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] )

entonces hazlo $var[0]

Valoraciones y comentarios

Te invitamos a añadir valor a nuestro contenido contribuyendo tu veteranía en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *