如何访问数组/对象?

时间:2015-06-06 09:04:08

标签: php arrays class object properties

我有以下数组,当我print_r(array_values($get_user));时,我得到:

Array (
          [0] => 10499478683521864
          [1] => 07/22/1983
          [2] => email@saya.com
          [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
        ) 

我尝试按如下方式访问数组:

echo $get_user[0];

但这显示了我:

  

undefined 0

注意:

我从 Facebook SDK 4 获取此数组,因此我不知道原始阵列结构。

如何从数组中以值email@saya.com作为示例进行访问?

5 个答案:

答案 0 :(得分:86)

要访问arrayobject,您需要了解如何使用两个不同的运算符。

Arrays

要访问数组元素,您必须使用[]或者您没有看到那么多,但您也可以使用{}

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

声明数组和访问数组元素之间的区别

定义数组和访问数组元素是两回事。所以不要混淆它们。

要定义数组,您可以使用array()或PHP> = 5.4 []并指定/设置数组/元素。当您使用上面提到的[]{}访问数组元素时,您将获得与设置元素相对的数组元素的值。

//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};

访问数组元素

要访问数组中的特定元素,您可以使用[]{}中的任何表达式,然后评估您要访问的键:

$array[(Any expression)]

因此,请注意您用作键的表达式以及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

访问多维数组

如果彼此有多个数组,则只需要一个多维数组。要访问子数组中的数组元素,您只需使用多个[]

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

Objects

要访问对象属性,您必须使用->

echo $object->property;

如果在另一个对象中有一个对象,则只需使用多个->即可访问对象属性。

echo $objectA->objectB->property;
  

注意:

     
      
  1. 如果您的商标名称无效,您还必须小心!因此,要查看使用无效的属性名称可能遇到的所有问题,请参阅此question/answer。如果您在属性名称的开头有数字,尤其是this one

  2.   
  3. 您只能从课堂外访问公开visibility的媒体资源。否则(私有或受保护)您需要一个方法或反射,您可以使用它来获取属性的值。

  4.   

阵列&对象

现在,如果您有相互混合的数组和对象,您只需查看现在是否访问数组元素或对象属性并使用相应的运算符。

//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'

我希望这能让您大致了解如何在阵列和对象彼此嵌套时访问它们。

  

注意:

     
      
  1. 如果调用它,则数组或对象取决于变量的最外层部分。所以 [new StdClass] 是一个数组,即使它内部有(嵌套)对象, $object->property = array(); 是< strong> object 即使它内部有(嵌套)数组。

         

    如果您不确定是否有对象或数组,请使用gettype()

  2.         

         

        
    1. 如果有人使用的是另一种编码风格,请不要感到困惑:

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

数组,对象和循环

如果您不想访问单个元素,则可以遍历嵌套数组/对象并浏览特定维度的值。

为此,您只需访问要循环的维度,然后就可以遍历该维度的所有值。

作为一个例子,我们采用一个数组,但它也可以是一个对象:

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

如果您遍历第一个维度,您将获得第一个维度的所有值:

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

在第一个维度中,您只有1个元素包含键($keydata和值($value):

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

如果您遍历第二维,您将获得第二维的所有值:

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

在第二个维度中,您将拥有3个元素,其中包含键($key012和值($value ):

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

通过这种方式,您可以遍历任何您想要的维度,无论它是数组还是对象。

分析var_dump() / print_r() / var_export()输出

所有这3个调试功能都输出相同的数据,只是以其他格式或某些元数据(例如类型,大小)输出。所以在这里我想展示你如何阅读这些函数的输出,以了解/了解如何从数组/对象访问某些数据。

输入数组:

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

var_dump()输出:

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

print_r()输出:

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

        )

)

var_export()输出:

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

因此,您可以看到所有输出非常相似。如果您现在想要访问值2,您可以从您想要访问的值本身开始,然后前往&#34;左上角&#34;。

1。我们首先看到,值2在一个数组中,键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,
),

这意味着我们必须使用[] / {}通过 [1] 访问值2,因为该值具有键/索引1。 / p>

2。接下来我们看到,数组被分配给具有对象的name属性的属性

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 */
)),

这意味着我们必须使用->来访问对象的属性,例如的 ->property

所以,直到现在我们知道,我们必须使用 ->property[1]

3。最后我们看到,最外层是一个数组

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

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

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

我们知道我们必须使用[]访问数组元素,我们在这里看到我们必须使用 ["key"] 来访问该对象。我们现在可以将所有这些部分放在一起并写下:

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

输出将是:

2

不要让PHP哄你!

有一些事情需要你知道,以免你花费数小时找到它们。

  1. &#34;隐藏&#34;字符

    有时候你的按键上有字符,在浏览器的第一眼看上去就看不到。然后你问自己,为什么你无法访问该元素。这些字符可以是:制表符(\t),新行(\n),空格或html标记(例如</p><b>)等。

    作为示例,如果您查看print_r()的输出,您会看到:

    Array ( [key] => HERE ) 
    

    然后您尝试使用以下命令访问该元素:

    echo $arr["key"];
    

    但是你得到了通知:

      

    注意:未定义索引:键

    这是一个很好的迹象,表明必须有一些隐藏的字符,因为你无法访问该元素,即使这些键看起来非常正确。

    这里的诀窍是使用var_dump() +查看您的源代码! (替代方案:highlight_string(print_r($variable, TRUE));

    突然间,你可能会看到这样的东西:

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

    现在您将看到,您的密钥中有一个html标记+一个新行字符,您首先看不到,因为print_r()并且浏览器没有表明了这一点。

    现在如果您尝试这样做:

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

    您将获得所需的输出:

    HERE
    
  2. 如果查看XML,永远不要相信print_r()var_dump()的输出

    您可能将XML文件或字符串加载到对象中,例如

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

    现在,如果您使用var_dump()print_r(),您会看到:

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

    因为你可以看到你没有看到标题的属性。正如我所说的那样,当你有一个XML对象时,永远不要相信var_dump()print_r()的输出。始终使用asXML()查看完整的XML文件/字符串。

    所以只需使用下面显示的方法之一:

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

    然后你会得到输出:

    <?xml version="1.0" encoding="UTF-8"?>
    <rss> 
        <item> 
            <title attribute="xy" ab="xy">test</title> 
        </item> 
    </rss>
    
  3. 有关详细信息,请参阅:

    常规(符号,错误)

    财产名称问题

答案 1 :(得分:8)

从这个问题我们看不到输入数组的结构。它可能是array ('id' => 10499478683521864, 'date' => '07/22/1983')。所以当你问$ demo [0]时,你会使用undefind index。

Array_values丢失键并返回数组,其中包含许多键,使数组为array(10499478683521864, '07/22/1983'...)。我们在问题中看到了这个结果。

因此,您可以采用相同的方式获取数组项值

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

答案 2 :(得分:2)

如果print_r($var)的输出是例如:

    Array ( [demo] => Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => email@saya.com ) )

然后执行$var['demo'][0]

如果print_r($var)的输出是例如:

    Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => email@saya.com )

然后执行$var[0]

答案 3 :(得分:0)

我写了一个小函数来访问数组或对象中的属性。我用了很多,发现它很方便

/**
 * 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;
  }
}

答案 4 :(得分:-1)

你可以使用

$ar = (array) $get_user;

然后你可以arra-wise访问他们的索引:

echo $ar[0];