php - How can I access an array/object?

82

I have the following array and when I doprint_r(array_values($get_user));, I get:

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
        ) 

I tried to access the array as followed:

echo $get_user[0];

But this displays me:

undefined 0

Note:

I get this array from the Facebook SDK 4, so I don't know the original array structure.

How can I access as an example the value[email protected] from the array?

445
280

Answer

Solution:

From the question we can't see the structure of input array. It maybearray ('id' => 10499478683521864, 'date' => '07/22/1983'). So when you ask $demo[0] you use undefind index.

Array_values lost keys and return array with numerous keys making array asarray(10499478683521864, '07/22/1983'...). This result we see in the question.

So, you can take an array item values by the same way

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

Answer

Solution:

If your output fromprint_r($var) is e.g:

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

then do$var['demo'][0]

If the output fromprint_r($var) is e.g:

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

then do$var[0]

512

Answer

Solution:

Before callingarray_values() on the response data, I am going to assume that your data was associative and it looks a little like this:

[
    'id' => 10499478683521864,
    'birthday' => '07/22/1983',
    'email' => '[email protected]',
    'first_name' => 'Alan',
    'gender' => 'male',
    'last_name' => 'Malmsteen',
    'link' => 'https://www.facebook.com/app_scoped_user_id/1049213468352864/',
    'location' => (object) [
        'id' => 102173722491792,
        'name' => 'Jakarta, Indonesia'
    ],
    'locale' => 'id_ID',
    'middle_name' => 'El-nino',
    'name' => 'Alan El-nino Malmsteen',
    'timezone' => 7,
    'updated_time' => '2015-05-28T04:09:50+0000',
    'verified' => 1
]

There is no benefit in re-indexing the keys of the payload. If your intention was to cast the data as an array, that is accomplished by decoding the json string withjson_decode($response, true), otherwisejson_decode($response).

If you try to pass$response as an object intoarray_values(), from PHP8 you will generateFatal error: Uncaught TypeError: array_values(): Argument #1 ($array) must be of type array, stdClass given.

In the above supplied data structure, there is an array with associative keys.

  • To access specific first level elements, you use "square brace" syntax with quoted string keys.
    • $response['id'] to access10499478683521864
    • $response['gender'] to accessmale
    • $response['location'] to access(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
  • To access the data nested inlocation (second level), "arrow syntax" is required because the data is an object.
    • $response['location']->id to access102173722491792
    • $response['location']->name to accessJakarta, Indonesia

After callingarray_values() on your response, the structure is an indexed array, so use square braces with unquoted integers.

  • $response[0] to access10499478683521864
  • $response[4] to accessmale
  • $response[7] to access(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
  • $response[7]->id to access102173722491792
  • $response[7]->name to accessJakarta, Indonesia

When you aren't sure what data type you are working with, use .


For cases when an object property (key) has illegal characters or there is immediately trailing characters that conflict with the key (see: 1, 2, 3), wrap the key in quotes and curly braces (or only curly braces for integers) to prevent syntax breakage.


If you want to loop through all of the elements in an array or object, aforeach() is suitable for both.

Code: (Demo)

foreach ($response as $key1 => $value1) {
    if (is_scalar($value1)) {
        echo "Key1: $key1, Value1: $value1\n";
    } else {
        foreach ($value1 as $key2 => $value2) {
            echo "Key1: $key1, Key2: $key2, Value2: $value2\n";
        }
    }
}

Output:

Key1: id, Value1: 10499478683521864
Key1: birthday, Value1: 07/22/1983
Key1: email, Value1: [email protected]
Key1: first_name, Value1: Alan
Key1: gender, Value1: male
Key1: last_name, Value1: Malmsteen
Key1: link, Value1: https://www.facebook.com/app_scoped_user_id/1049213468352864/
Key1: location, Key2: id, Value2: 102173722491792
Key1: location, Key2: name, Value2: Jakarta, Indonesia
Key1: locale, Value1: id_ID
Key1: middle_name, Value1: El-nino
Key1: name, Value1: Alan El-nino Malmsteen
Key1: timezone, Value1: 7
Key1: updated_time, Value1: 2015-05-28T04:09:50+0000
Key1: verified, Value1: 1
22

Answer

Solution:

I wrote a small function for accessing properties in either arrays or objects. I use it quite a bit find it pretty handy

/**
 * Access array or object values easily, with default fallback
 */
if( ! function_exists('element') )
{
  function element( &$array, $key, $default = NULL )
  {
    // Check array first
    if( is_array($array) )
    {
      return isset($array[$key]) ? $array[$key] : $default;
    }

    // Object props
    if( ! is_int($key) && is_object($array) )
    {
      return property_exists($array, $key) ? $array->{$key} : $default;
    }

    // Invalid type
    return NULL;
  }
}
410

Answer

Solution:

function kPrint($key,$obj){    
return (gettype($obj)=="array"?(array_key_exists($key,$obj)?$obj[$key]:("<font color='red'>NA</font>")):(gettype($obj)=="object"?(property_exists($obj,$key)?$obj->$key:("<font color='red'>NA</font>")):("<font color='red'><font color='green'>

//you can call this function whenever you want to access item from the array or object. this function prints that respective value from the array/object as per key.

126
144

Answer

Solution:

From the question we can't see the structure of input array. It maybearray ('id' => 10499478683521864, 'date' => '07/22/1983'). So when you ask $demo[0] you use undefind index.

Array_values lost keys and return array with numerous keys making array asarray(10499478683521864, '07/22/1983'...). This result we see in the question.

So, you can take an array item values by the same way

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

Answer

Solution:

If your output fromprint_r($var) is e.g:

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

then do$var['demo'][0]

If the output fromprint_r($var) is e.g:

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

then do$var[0]

752

Answer

Solution:

Before callingarray_values() on the response data, I am going to assume that your data was associative and it looks a little like this:

[
    'id' => 10499478683521864,
    'birthday' => '07/22/1983',
    'email' => '[email protected]',
    'first_name' => 'Alan',
    'gender' => 'male',
    'last_name' => 'Malmsteen',
    'link' => 'https://www.facebook.com/app_scoped_user_id/1049213468352864/',
    'location' => (object) [
        'id' => 102173722491792,
        'name' => 'Jakarta, Indonesia'
    ],
    'locale' => 'id_ID',
    'middle_name' => 'El-nino',
    'name' => 'Alan El-nino Malmsteen',
    'timezone' => 7,
    'updated_time' => '2015-05-28T04:09:50+0000',
    'verified' => 1
]

There is no benefit in re-indexing the keys of the payload. If your intention was to cast the data as an array, that is accomplished by decoding the json string withjson_decode($response, true), otherwisejson_decode($response).

If you try to pass$response as an object intoarray_values(), from PHP8 you will generateFatal error: Uncaught TypeError: array_values(): Argument #1 ($array) must be of type array, stdClass given.

In the above supplied data structure, there is an array with associative keys.

  • To access specific first level elements, you use "square brace" syntax with quoted string keys.
    • $response['id'] to access10499478683521864
    • $response['gender'] to accessmale
    • $response['location'] to access(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
  • To access the data nested inlocation (second level), "arrow syntax" is required because the data is an object.
    • $response['location']->id to access102173722491792
    • $response['location']->name to accessJakarta, Indonesia

After callingarray_values() on your response, the structure is an indexed array, so use square braces with unquoted integers.

  • $response[0] to access10499478683521864
  • $response[4] to accessmale
  • $response[7] to access(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
  • $response[7]->id to access102173722491792
  • $response[7]->name to accessJakarta, Indonesia

When you aren't sure what data type you are working with, use .


For cases when an object property (key) has illegal characters or there is immediately trailing characters that conflict with the key (see: 1, 2, 3), wrap the key in quotes and curly braces (or only curly braces for integers) to prevent syntax breakage.


If you want to loop through all of the elements in an array or object, aforeach() is suitable for both.

Code: (Demo)

foreach ($response as $key1 => $value1) {
    if (is_scalar($value1)) {
        echo "Key1: $key1, Value1: $value1\n";
    } else {
        foreach ($value1 as $key2 => $value2) {
            echo "Key1: $key1, Key2: $key2, Value2: $value2\n";
        }
    }
}

Output:

Key1: id, Value1: 10499478683521864
Key1: birthday, Value1: 07/22/1983
Key1: email, Value1: [email protected]
Key1: first_name, Value1: Alan
Key1: gender, Value1: male
Key1: last_name, Value1: Malmsteen
Key1: link, Value1: https://www.facebook.com/app_scoped_user_id/1049213468352864/
Key1: location, Key2: id, Value2: 102173722491792
Key1: location, Key2: name, Value2: Jakarta, Indonesia
Key1: locale, Value1: id_ID
Key1: middle_name, Value1: El-nino
Key1: name, Value1: Alan El-nino Malmsteen
Key1: timezone, Value1: 7
Key1: updated_time, Value1: 2015-05-28T04:09:50+0000
Key1: verified, Value1: 1
304

Answer

Solution:

I wrote a small function for accessing properties in either arrays or objects. I use it quite a bit find it pretty handy

/**
 * Access array or object values easily, with default fallback
 */
if( ! function_exists('element') )
{
  function element( &$array, $key, $default = NULL )
  {
    // Check array first
    if( is_array($array) )
    {
      return isset($array[$key]) ? $array[$key] : $default;
    }

    // Object props
    if( ! is_int($key) && is_object($array) )
    {
      return property_exists($array, $key) ? $array->{$key} : $default;
    }

    // Invalid type
    return NULL;
  }
}
492

Answer

Solution:

function kPrint($key,$obj){    
return (gettype($obj)=="array"?(array_key_exists($key,$obj)?$obj[$key]:("<font color='red'>NA</font>")):(gettype($obj)=="object"?(property_exists($obj,$key)?$obj->$key:("<font color='red'>NA</font>")):("<font color='red'><font color='green'>

//you can call this function whenever you want to access item from the array or object. this function prints that respective value from the array/object as per key.

997

Answer

Solution:

To access an{-code-{-code-32}} or{-code-2} you how to use two different operators.

Arrays

To access {-code-{-code-32}} elements you have to use[].

echo ${-code-{-code-32}}[{-code-3{-code-32}}];

On older PHP versions, an alternative syntax using{} was also allowed:

echo ${-code-{-code-32}}{{-code-3{-code-32}}};

Difference between declaring an {-code-{-code-32}} and accessing an {-code-{-code-32}} element

Defining an {-code-{-code-32}} and accessing an {-code-{-code-32}} element are two different things. So don't mix them up.

To define an {-code-{-code-32}} you can use{-code-{-code-32}}() or for PHP >=5.4[] and you assign/set an {-code-{-code-32}}/-element. While when you are accessing an {-code-{-code-32}} element with[] as mentioned above, you get the value of an {-code-{-code-32}} element opposed to setting an element.

//Declaring an {-code-{-code-32}}
${-code-{-code-32}}A = {-code-{-code-32}} ( /*Some stuff in here*/ );
${-code-{-code-32}}B = [ /*Some stuff in here*/ ]; //Only for PHP >=5.4

//Accessing an {-code-{-code-32}} element
echo ${-code-{-code-32}}[{-code-3{-code-32}}];

Access {-code-{-code-32}} element

To access a particular element in an {-code-{-code-32}} you can use any expression inside[] or{} which then evaluates to the key you want to access:

${-code-{-code-32}}[(Any expression)]

So just be aware of what expression you use as key and how it gets interpreted by PHP:

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

Access multidimensional {-code-{-code-32}}

If you have multiple {-code-{-code-32}}s in each other you simply have a multidimensional {-code-{-code-32}}. To access an {-code-{-code-32}} element in a sub {-code-{-code-32}} you just have to use multiple[].

echo ${-code-{-code-32}}["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"]
         // ├─────────────┘  ├──────────────┘  ├────────────────────────────┘
         // │                │                 └── 3rd Array dimension;
         // │                └──────────────────── 2d  Array dimension;
         // └───────────────────────────────────── {-code-32}st Array dimension;
Objects

To access an {-code-2} property you have to use{-code-{-code-32}5}.

echo ${-code-2}{-code-{-code-32}5}property;

If you have an {-code-2} in another {-code-2} you just have to use multiple{-code-{-code-32}5} to get to your {-code-2} property.

echo ${-code-2}A{-code-{-code-32}5}{-code-2}B{-code-{-code-32}5}property;

Note:

  1. Also you have to be careful if you have a property name which is invalid! So to see all problems, which you can face with an invalid property name see this question/answer. And especially this one if you have numbers at the start of the property name.

  2. You can only access properties with public visibility from outside of the class. Otherwise (private or protected) you need a method or reflection, which you can use to get the value of the property.

Arrays & Objects

Now if you have {-code-{-code-32}}s and {-code-2}s mixed in each other you just have to look if you now access an {-code-{-code-32}} element or an {-code-2} property and use the corresponding operator for it.

//Object
echo ${-code-2}->anotherObject->propertyArray["elementOneWithAnObject"]->property;
    //├────┘  ├───────────┘  ├───────────┘ ├──────────────────────┘   ├──────┘
    //│       │              │             │                          └── property ; 
    //│       │              │             └───────────────────────────── {-code-{-code-32}} element ({-code-2}) ; Use -> To access the property 'property'
    //│       │              └─────────────────────────────────────────── {-code-{-code-32}} (property) ; Use [] To access the {-code-{-code-32}} element 'elementOneWithAnObject'
    //│       └────────────────────────────────────────────────────────── property ({-code-2}) ; Use -> To access the property 'propertyArray'
    //└────────────────────────────────────────────────────────────────── {-code-2} ; Use -> To access the property 'anotherObject'


//Array
echo ${-code-{-code-32}}["{-code-{-code-32}}Element"]["anotherElement"]->{-code-2}->property["element"];
    //├───┘ ├────────────┘  ├──────────────┘   ├────┘  ├──────┘ ├───────┘
    //│     │               │                  │       │        └── {-code-{-code-32}} element ; 
    //│     │               │                  │       └─────────── property ({-code-{-code-32}}) ; Use [] To access the {-code-{-code-32}} element 'element'
    //│     │               │                  └─────────────────── property ({-code-2}) ; Use -> To access the property 'property'
    //│     │               └────────────────────────────────────── {-code-{-code-32}} element ({-code-2}) ; Use -> To access the property '{-code-2}'
    //│     └────────────────────────────────────────────────────── {-code-{-code-32}} element ({-code-{-code-32}}) ; Use [] To access the {-code-{-code-32}} element 'anotherElement'
    //└──────────────────────────────────────────────────────────── {-code-{-code-32}} ; Use [] To access the {-code-{-code-32}} element '{-code-{-code-32}}Element'

I hope this gives you a rough idea how you can access {-code-{-code-32}}s and {-code-2}s, when they are nested in each other.

Note:

  1. If it is called an {-code-{-code-32}} or {-code-2} depends on the outermost part of your variable. So {-code-{-code-32}9} is an {-code-{-code-32}} even if it has (nested) {-code-2}s inside of it and ${-code-2}{-code-{-code-32}5}property = {-code-{-code-32}}(); is an {-code-2} even if it has (nested) {-code-{-code-32}}s inside.

    And if you are not sure if you have an {-code-2} or {-code-{-code-32}}, just use .

  2. Don't get yourself confused if someone uses another coding style than you:

     //Both methods/styles work and access the same {-code-26}
     echo ${-code-2}{-code-{-code-32}5}anotherObject{-code-{-code-32}5}propertyArray["elementOneWithAnObject"]{-code-{-code-32}5}property;
     echo ${-code-2}{-code-{-code-32}5}
            anotherObject
            {-code-{-code-32}5}propertyArray
            ["elementOneWithAnObject"]{-code-{-code-32}5}
            property;
    
     //Both methods/styles work and access the same {-code-26}
     echo ${-code-{-code-32}}["{-code-{-code-32}}Element"]["anotherElement"]{-code-{-code-32}5}{-code-2}{-code-{-code-32}5}property["element"];
     echo ${-code-{-code-32}}["{-code-{-code-32}}Element"]
         ["anotherElement"]{-code-{-code-32}5}
             {-code-2}
       {-code-{-code-32}5}property["element"];
    

Arrays, Objects and Loops

If you don't just want to access a single element you can loop over your nested {-code-{-code-32}} / {-code-2} and go through the values of a particular dimension.

For this you just have to access the dimension over which you want to loop and then you can loop over all values of that dimension.

As an example we take an {-code-{-code-32}}, but it could also be an {-code-2}:

{-code-23}

If you loop over the first dimension you will get all values from the first dimension:

foreach(${-code-{-code-32}} as {-code-25} => {-code-27})

Means here in the first dimension you would only have {-code-32} element with the key({-code-25}){-code-26} and the value({-code-27}):

Array (  //Key: {-code-{-code-32}}
    [{-code-3{-code-32}}] => stdClass Object (
            [propertyXY] => {-code-32}
        )
    [{-code-32}] => stdClass Object (
            [propertyXY] => 2
        )
    [2] => stdClass Object (
            [propertyXY] => 3
        )
)

If you loop over the second dimension you will get all values from the second dimension:

foreach(${-code-{-code-32}}["{-code-26}"] as {-code-25} => {-code-27})

Means here in the second dimension you would have 3 element with the keys({-code-25}){-code-3{-code-32}},{-code-32},2 and the values({-code-27}):

stdClass Object (  //Key: {-code-3{-code-32}}
    [propertyXY] => {-code-32}
)
stdClass Object (  //Key: {-code-32}
    [propertyXY] => 2
)
stdClass Object (  //Key: 2
    [propertyXY] => 3
)

And with this you can loop through any dimension which you want no matter if it is an {-code-{-code-32}} or {-code-2}.

Analyse / / output

All of these 3 debug functions output the same {-code-26}, just in another format or with some meta {-code-26} (e.g. type, size). So here I want to show how you have to read the output of these functions to know/get to the way how to access certain {-code-26} from your {-code-{-code-32}}/{-code-2}.

Input {-code-{-code-32}}:

${-code-{-code-32}} = [
    "key" => ({-code-2}) [
        "property" => [{-code-32},2,3]
    ]
];

var_dump() output:

{-code-{-code-32}}({-code-32}) {
  ["key"]=>
  {-code-2}(stdClass)#{-code-32} ({-code-32}) {
    ["property"]=>
    {-code-{-code-32}}(3) {
      [{-code-3{-code-32}}]=>
      int({-code-32})
      [{-code-32}]=>
      int(2)
      [2]=>
      int(3)
    }
  }
}

print_r() output:

Array
(
    [key] => stdClass Object
        (
            [property] => Array
                (
                    [{-code-3{-code-32}}] => {-code-32}
                    [{-code-32}] => 2
                    [2] => 3
                )

        )

)

var_export() output:

{-code-{-code-32}} (
  'key' => 
  ({-code-2}) {-code-{-code-32}}(
     'property' => 
    {-code-{-code-32}} (
      {-code-3{-code-32}} => {-code-32},
      {-code-32} => 2,
      2 => 3,
    ),
  ),
)

So as you can see all outputs are pretty similar. And if you now want to access the value 2 you can just start from the value itself, which you want to access and work your way out to the "top left".

{-code-32}. We first see, that the value 2 is in an {-code-{-code-32}} with the key {-code-32}

// var_dump()
{-code-{-code-32}}(3) {
  [{-code-3{-code-32}}]=>
  int({-code-32})
  [{-code-32}]=>
  int(2)    // <-- value we want to access
  [2]=>
  int(3)
}

// print_r()
Array
(
    [{-code-3{-code-32}}] => {-code-32}
    [{-code-32}] => 2    // <-- value we want to access
    [2] => 3
)

// var_export()
{-code-{-code-32}} (
  {-code-3{-code-32}} => {-code-32},
  {-code-32} => 2,    // <-- value we want to access
  2 => 3,
)

This means we have to use[] to access the value 2 with [{-code-32}], since the value has the key/index {-code-32}.

2. Next we see, that the {-code-{-code-32}} is assigned to a property with the name property of an {-code-2}

// var_dump()
{-code-2}(stdClass)#{-code-32} ({-code-32}) {
  ["property"]=>
  /* Array here */
}

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

// var_export()
({-code-2}) {-code-{-code-32}}(
    'property' => 
  /* Array here */
),

This means we have to use{-code-{-code-32}5} to access the property of the {-code-2}, e.g. {-code-{-code-32}5}property.

So until now, we know that we have to use {-code-{-code-32}5}property[{-code-32}].

3. And at the end we see, that the outermost is an {-code-{-code-32}}

// var_dump()
{-code-{-code-32}}({-code-32}) {
  ["key"]=>
  /* Object & Array here */
}

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

// var_export()
{-code-{-code-32}} (
  'key' => 
  /* Object & Array here */
)

As we know that we have to access an {-code-{-code-32}} element with[], we see here that we have to use ["key"] to access the {-code-2}. We now can put all these parts together and write:

echo ${-code-{-code-32}}["key"]{-code-{-code-32}5}property[{-code-32}];

And the output will be:

2
Don't let PHP troll you!

There are a few things, which you have to know, so that you don't spend hours on it finding them.

  1. "Hidden" characters

    Sometimes you have characters in your keys, which you don't see on the first look in the browser. And then you're asking yourself, why you can't access the element. These characters can be: tabs (\t), new lines (\n), spaces or html tags (e.g.</p>,<b>), etc.

    As an example if you look at the output ofprint_r() and you see:

    Array ( [key] => HERE ) 
    

    Then you are trying to access the element with:

    echo $arr["key"];
    

    But you are getting the notice:

    Notice: Undefined index: key

    This is a good indication that there must be some hidden characters, since you can't access the element, even if the keys seems pretty correct.

    The trick here is to usevar_dump() + look into your source code! (Alternative:highlight_string(print_r($variable, TRUE));)

    And all of the sudden you will maybe see stuff like this:

    {-code-{-code-32}}({-code-32}) {
        ["</b>
    key"]=>
        string(4) "HERE"
    }
    

    Now you will see, that your key has a html tag in it + a new line character, which you didn't saw in the first place, sinceprint_r() and the browser didn't showed that.

    So now if you try to do:

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

    You will get your desired output:

    HERE
    
  2. Never trust the output ofprint_r() orvar_dump() if you look at XML

    You might have an XML file or string loaded into an {-code-2}, e.g.

    <?xml version="{-code-32}.{-code-3{-code-32}}" encoding="UTF-8" ?> 
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    

    Now if you usevar_dump() orprint_r() you will see:

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

    So as you can see you don't see the attributes of title. So as I said never trust the output ofvar_dump() orprint_r() when you have an XML {-code-2}. Always use to see the full XML file/string.

    So just use one of the methods shown below:

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

    And then you will get the output:

    <?xml version="{-code-32}.{-code-3{-code-32}}" encoding="UTF-8"?>
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    

For more information see:

General (symbols, errors)

Property name problems

432

Answer

Solution:

From the question we can't see the structure of input array. It maybearray ('id' => 10499478683521864, 'date' => '07/22/1983'). So when you ask $demo[0] you use undefind index.

Array_values lost keys and return array with numerous keys making array asarray(10499478683521864, '07/22/1983'...). This result we see in the question.

So, you can take an array item values by the same way

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

Answer

Solution:

If your output fromprint_r($var) is e.g:

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

then do$var['demo'][0]

If the output fromprint_r($var) is e.g:

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

then do$var[0]

246

Answer

Solution:

Before callingarray_values() on the response data, I am going to assume that your data was associative and it looks a little like this:

[
    'id' => 10499478683521864,
    'birthday' => '07/22/1983',
    'email' => '[email protected]',
    'first_name' => 'Alan',
    'gender' => 'male',
    'last_name' => 'Malmsteen',
    'link' => 'https://www.facebook.com/app_scoped_user_id/1049213468352864/',
    'location' => (object) [
        'id' => 102173722491792,
        'name' => 'Jakarta, Indonesia'
    ],
    'locale' => 'id_ID',
    'middle_name' => 'El-nino',
    'name' => 'Alan El-nino Malmsteen',
    'timezone' => 7,
    'updated_time' => '2015-05-28T04:09:50+0000',
    'verified' => 1
]

There is no benefit in re-indexing the keys of the payload. If your intention was to cast the data as an array, that is accomplished by decoding the json string withjson_decode($response, true), otherwisejson_decode($response).

If you try to pass$response as an object intoarray_values(), from PHP8 you will generateFatal error: Uncaught TypeError: array_values(): Argument #1 ($array) must be of type array, stdClass given.

In the above supplied data structure, there is an array with associative keys.

  • To access specific first level elements, you use "square brace" syntax with quoted string keys.
    • $response['id'] to access10499478683521864
    • $response['gender'] to accessmale
    • $response['location'] to access(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
  • To access the data nested inlocation (second level), "arrow syntax" is required because the data is an object.
    • $response['location']->id to access102173722491792
    • $response['location']->name to accessJakarta, Indonesia

After callingarray_values() on your response, the structure is an indexed array, so use square braces with unquoted integers.

  • $response[0] to access10499478683521864
  • $response[4] to accessmale
  • $response[7] to access(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
  • $response[7]->id to access102173722491792
  • $response[7]->name to accessJakarta, Indonesia

When you aren't sure what data type you are working with, use .


For cases when an object property (key) has illegal characters or there is immediately trailing characters that conflict with the key (see: 1, 2, 3), wrap the key in quotes and curly braces (or only curly braces for integers) to prevent syntax breakage.


If you want to loop through all of the elements in an array or object, aforeach() is suitable for both.

Code: (Demo)

foreach ($response as $key1 => $value1) {
    if (is_scalar($value1)) {
        echo "Key1: $key1, Value1: $value1\n";
    } else {
        foreach ($value1 as $key2 => $value2) {
            echo "Key1: $key1, Key2: $key2, Value2: $value2\n";
        }
    }
}

Output:

Key1: id, Value1: 10499478683521864
Key1: birthday, Value1: 07/22/1983
Key1: email, Value1: [email protected]
Key1: first_name, Value1: Alan
Key1: gender, Value1: male
Key1: last_name, Value1: Malmsteen
Key1: link, Value1: https://www.facebook.com/app_scoped_user_id/1049213468352864/
Key1: location, Key2: id, Value2: 102173722491792
Key1: location, Key2: name, Value2: Jakarta, Indonesia
Key1: locale, Value1: id_ID
Key1: middle_name, Value1: El-nino
Key1: name, Value1: Alan El-nino Malmsteen
Key1: timezone, Value1: 7
Key1: updated_time, Value1: 2015-05-28T04:09:50+0000
Key1: verified, Value1: 1
693

Answer

Solution:

I wrote a small function for accessing properties in either arrays or objects. I use it quite a bit find it pretty handy

/**
 * Access array or object values easily, with default fallback
 */
if( ! function_exists('element') )
{
  function element( &$array, $key, $default = NULL )
  {
    // Check array first
    if( is_array($array) )
    {
      return isset($array[$key]) ? $array[$key] : $default;
    }

    // Object props
    if( ! is_int($key) && is_object($array) )
    {
      return property_exists($array, $key) ? $array->{$key} : $default;
    }

    // Invalid type
    return NULL;
  }
}
451

Answer

Solution:

function kPrint($key,$obj){    
return (gettype($obj)=="array"?(array_key_exists($key,$obj)?$obj[$key]:("<font color='red'>NA</font>")):(gettype($obj)=="object"?(property_exists($obj,$key)?$obj->$key:("<font color='red'>NA</font>")):("<font color='red'><font color='green'>

//you can call this function whenever you want to access item from the array or object. this function prints that respective value from the array/object as per key.

People are also looking for solutions to the problem: php - Strip special characters and +1 from phone number

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.