我怎样才能访问一个数组/对象?

我有以下数组,当我做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获得这个数组,所以我不知道原始数组strucutre。

我如何从数组中访问值email@saya.com

要访问一个arrayobject你如何使用两个不同的操作符。

数组

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

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

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

定义一个数组并访问一个数组元素是两回事。 所以不要混淆。

要定义一个数组,你可以使用array()或者PHP> = 5.4 []分配/设置一个数组/元素。 当你正在用上面提到的[]{}访问一个数组元素的时候,你会得到一个数组元素的值,它与设置一个元素相反。

  // 声明一个数组
 $ arrayA = array( / *一些东西在这里* /  ;
 $ arrayB = [ / *有些东西在这里* / ] ;  //仅适用于PHP> = 5.4

 // 访问一个数组元素
 echo $ array [ 0 ] ;
 echo $ array { 0 } ;

访问数组元素

要访问数组中的特定元素,可以使用[]{}任何expression式,然后计算出您要访问的键:

  $ array [ (任何expression式) ]

所以,只要知道你用什么expression式作为关键字,以及它是如何被PHP解释的:

  echo $ array [ 0 ];  //键是一个整数 ; 它访问0的元素
 echo $ array [ “0” ];  //键是一个string ; 它访问0的元素
 echo $ array [ “string” ];  //键是一个string ; 它使用键“string”访问元素
 echo $ array [ CONSTANT ];  //这个键是一个常量 ,它被replace为相应的值
 echo $ array [ cOnStAnT ];  //键也是一个常量而不是一个string
 echo $ array [ $ anyVariable ] //这个键是一个variables ,它被replace为'$ anyVariable'中的值
 echo $ array [ functionXY() ];  //键将是函数的返回值

访问multidimensional array

如果你有多个数组,你只需要一个multidimensional array。 要访问子数组中的数组元素,只需使用多个[]

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

对象

要访问一个对象属性,你必须使用->

  echo $ object - > property;

如果你在另一个对象中有一个对象,你只需要使用多个->来获得你的对象属性。

 echo $objectA->objectB->property; 

注意:

  1. 如果你有一个无效的属性名称,你也必须小心! 所以要看到所有问题,你可以面对一个无效的属性名称看到这个问题/答案 。 尤其是如果你在属性名称的开头有数字的话。

  2. 您只能从课堂外访问具有公开可见性的属性。 否则(私有或受保护的),您需要一个方法或reflection,您可以使用它来获取属性的值。

数组和对象

现在,如果你有数组和对象混合在一起,你只需要看看你现在是否访问一个数组元素或对象属性,并使用相应的操作符。

  //目的
 echo $ object-> anotherObject-> propertyArray [“elementOneWithAnObject”]  - > property;
     //├────┘├────────────├────────────├─────────────── ───────┘├──────┘
     //││││└──财产; 
     //数组元素(object); //数组元素(object); //数组元素 使用- >要访问属性“属性”
     //││└───────────────────────────────────────────────────────────array(财产); 使用[]来访问数组元素'elementOneWithAnObject'
     //│└──────────────────────────────────────── ────────────财产(物件); 使用- >要访问属性'propertyArray'
     //└─────────────────────────────────────────────── ───────────────────对象; 使用- >要访问属性'anotherObject'


 //数组
 echo $ array [“arrayElement”] [“anotherElement”]  - > object-> property [“element”];
     //├───┘├────────────┘├──────────────┘├─────├────── ┘├───────┘
     //数组元素; //数组元素; 
     //数组;(); 使用[]来访问数组元素'element'
     //物件(物件); //物件(物件); 使用- >要访问属性“属性”
     //数组元素(object); //数组元素(object); //数组元素 使用- >要访问属性“对象”
     //│└──────────────────────────────────────── ─────────数组元素(数组); 使用[]来访问数组元素'anotherElement'
     //└─────────────────────────────────────────────── ─────────────数组; 使用[]来访问数组元素'arrayElement'

我希望这给你一个粗略的想法,当它们嵌套在一起时,如何访问数组和对象。

注意:

  1. 如果它被称为数组或对象取决于variables的最外面的部分。 所以[new StdClass]是一个数组,即使它有(嵌套的)对象在它和$object->property = array(); 是一个对象,即使它有(嵌套)数组。

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

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

数组,对象和循环

如果你不只是想访问一个单一的元素,你可以遍历你的嵌套数组/对象,并通过特定维度的值。

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

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

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

如果循环遍历第一维,则将从第一维获取所有值:

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

在第一维意味着你将只有一个元素的关键( $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)

在第二维意味着你将有三个元素与键( $key0和值( $value ):

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

用这个你可以循环任何你想要的维度,不pipe它是一个数组还是对象。

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

所有这三个debuggingfunction都以相同的格式或者一些元数据(例如types,大小)输出相同的数据。 所以在这里,我想展示如何读取这些函数的输出,以了解如何访问数组/对象中的某些数据。

input数组:

 $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,你可以从你想要访问的值本身开始,并按照“左上angular”的方式工作。

1.我们首先看到,值2与关键字1是一个数组

  数组(3){ // var_dump()
   [0] =>
   INT(1)
   [1] => 
    INT(2)
   [2] =>
   INT(3)
 }

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

  数组( // var_export()
   0 => 1,
   1 => 2,
   2 => 3,
 

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

接下来我们看到,该数组被分配给一个对象的name属性的属性

  对象 (stdClass)#1(1) { // var_dump()
   [“property”] =>
     / *数组在这里* /
 }

  stdClass 对象 // print_r()
 
   [property] => / *这里的数组* /
 

  stdClass :: __ set_state  array(// var_export()
   'property' => 
     / *数组在这里* /
 ) ),

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

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

最后我们看到,最外面的是一个数组

  数组(1){ // var_dump()
   [“key”] =>
     / *对象和数组在这里* /
 }

  数组 // print_r()
 
   [key] => 
     / *对象和数组在这里* /
 

  数组( // var_export()
   'key' =>
     / *对象和数组在这里* /
 

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

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

输出将是:

 2 

不要让PHP巨魔!

有几件事,你必须知道,所以你不花几个小时find它们。

  1. “隐藏”字符

    有时候你的钥匙上有字符,在浏览器的第一眼看不到。 然后你问自己,为什么你不能访问元素。 这些字符可以是:制表符( \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文件或string加载到一个对象,例如

     <?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文件/string。

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

     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> 

有关更多信息,请参阅

一般(符号,错误)

  • 参考 – 这个符号在PHP中意味着什么?
  • 参考 – 这个错误在PHP中意味着什么?
  • PHP分析/语法错误; 以及如何解决它们?

属性名称问题

  • 我如何访问名称无效的媒体资源?
  • 如何使用整数等名称访问对象属性?

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

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

所以,你可以通过相同的方式获取一个数组项的值

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

如果你从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]

您可以使用

 $ar = (array) $get_user; 

那么你可以按照顺序访问他们的索引:

 echo $ar[0];