valor una multidimensional matriz hacer como buscar array 3x3 php arrays class object properties

una - buscar valor en array multidimensional php



¿Cómo puedo acceder a una matriz/objeto? (4)

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

Array_values ​​perdió las claves y devolvió la matriz con numerosas claves que hacen la matriz como array(10499478683521864, ''07/22/1983''...) . Este resultado lo vemos en la pregunta.

Por lo tanto, puede tomar los valores de un elemento de matriz de la misma manera

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

Tengo la siguiente matriz y cuando hago print_r(array_values($get_user)); , Yo obtengo:

Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] [3] => Alan [4] => male [5] => Malmsteen [6] => https://www.facebook.com app_scoped_user_id/1049213468352864/ [7] => stdClass Object ( [id] => 102173722491792 [name] => Jakarta, Indonesia ) [8] => id_ID [9] => El-nino [10] => Alan El-nino Malmsteen [11] => 7 [12] => 2015-05-28T04:09:50+0000 [13] => 1 )

Traté de acceder a la matriz de la siguiente manera:

echo $get_user[0];

Pero esto me muestra:

indefinido 0

Nota:

Obtengo esta matriz del SDK 4 de Facebook , por lo que no conozco la estructura original de la matriz.

¿Cómo puedo acceder como ejemplo al valor [email protected] de la matriz?


Para acceder a una array u object , debe utilizar dos operadores diferentes.

Arrays

Para acceder a los elementos de la matriz, debe usar [] o que no ve mucho, pero que también puede usar es {} .

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

Diferencia entre declarar una matriz y acceder a un elemento de matriz

Definir una matriz y acceder a un elemento de matriz son dos cosas diferentes. Así que no los mezcles.

Para definir una matriz, puede usar array() o para PHP> = 5.4 [] y asignar / establecer una matriz / elemento. Mientras que cuando accede a un elemento de matriz con [] o {} como se mencionó anteriormente, obtiene el valor de un elemento de matriz en lugar de establecer 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 $array{0};

Elemento de matriz de acceso

Para acceder a un elemento particular en una matriz, puede usar cualquier expresión dentro de [] o {} que luego evalúa la clave a la que desea acceder:

$array[(Any expression)]

Entonces, tenga en cuenta qué expresión usa como clave y cómo PHP la interpreta:

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

Acceda a una matriz multidimensional

Si tiene varias matrices entre sí, simplemente tiene una matriz multidimensional. Para acceder a un elemento de matriz en una matriz secundaria solo tiene que usar múltiples [] .

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

Objects

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

echo $object->property;

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

echo $objectA->objectB->property;

Nota:

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

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

Arreglos y objetos

Ahora, si tiene matrices y objetos mezclados entre sí, solo tiene que mirar si ahora accede a un elemento de matriz o una propiedad de objeto y usa 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 te dé una idea aproximada de cómo puedes acceder a matrices y objetos, cuando están anidados entre sí.

Nota:

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

    Y si no está seguro de tener un objeto o una matriz, simplemente use gettype() .

  1. No se confunda si alguien usa otro estilo de codificación que usted:

    //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"];

Arreglos, objetos y bucles

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

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

Como ejemplo tomamos una matriz, 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 los datos clave ( $key ) 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ía 3 elementos con las teclas ( $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 una matriz u objeto.

Analizar salida var_dump() / print_r() / var_export()

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

Matriz de entrada:

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

salida var_dump() :

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

salida print_r() :

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

salida var_export() :

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í mismo, al que desea acceder y llegar a la "parte superior izquierda".

1. Primero vemos que el valor 2 está en una matriz con la clave 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 la clave / índice 1.

2. Luego vemos que la matriz se asigna a una propiedad con la propiedad de nombre 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, por ejemplo, ->property .

Entonces, hasta ahora sabemos que tenemos que usar ->property[1] .

3. Y al final vemos que lo más externo es una matriz

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 elemento de matriz 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 perder horas en encontrarlas.

  1. Personajes "ocultos"

    A veces tienes caracteres en tus teclas, que no ves en la primera mirada en el navegador. Y luego te preguntas por qué no puedes acceder al elemento. Estos caracteres pueden ser: pestañas ( /t ), nuevas líneas ( /n ), espacios o etiquetas html (p. Ej. </p> , <b> ), etc.

    Como ejemplo, si mira la salida de print_r() y ve:

    Array ( [key] => HERE )

    Entonces está intentando acceder al elemento con:

    echo $arr["key"];

    Pero estás recibiendo el aviso:

    Aviso: índice indefinido: clave

    Esta es una buena indicación de que debe haber algunos caracteres ocultos, ya que no puede acceder al elemento, incluso si las teclas parecen bastante correctas.

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

    Y de repente quizás veas cosas como esta:

    array(1) { ["</b> key"]=> string(4) "HERE" }

    Ahora verá que su clave tiene una etiqueta html + un nuevo carácter de línea, que no vio en primer lugar, ya que print_r() y el navegador no lo mostraron.

    Así que ahora si intentas hacer:

    echo $arr["</b>/nkey"];

    Obtendrá el resultado deseado:

    HERE

  2. Nunca confíe en la salida de print_r() o var_dump() si mira XML

    Es posible que tenga un archivo XML o una cadena cargada en un objeto, por ejemplo

    <?xml version="1.0" encoding="UTF-8" ?> <rss> <item> <title attribute="xy" ab="xy">test</title> </item> </rss>

    Ahora si usa var_dump() o print_r() verá:

    SimpleXMLElement Object ( [item] => SimpleXMLElement Object ( [title] => test ) )

    Entonces, como puedes ver, no ves los atributos del título. Entonces, como dije, nunca confíes en la salida de var_dump() o print_r() cuando tienes un objeto XML. Utilice siempre asXML() para ver el archivo / cadena XML completo.

    Tan solo use 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 la salida:

    <?xml version="1.0" encoding="UTF-8"?> <rss> <item> <title attribute="xy" ab="xy">test</title> </item> </rss>

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?
  • PHP Parse / Errores de sintaxis; y como resolverlos?

Problemas de nombre de propiedad

  • question/answer
  • ¿Cómo acceder a las propiedades de los objetos con nombres como enteros?

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

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

luego haga $var[''demo''][0]

Si el resultado de print_r($var) es, por ejemplo:

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

entonces haz $var[0]


puedes usar

$ar = (array) $get_user;

entonces puede acceder a sus índices en forma de matriz:

echo $ar[0];