我怎样才能访问一个数组/对象?
我有以下数组,当我做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
?
要访问一个array
或object
你如何使用两个不同的操作符。
数组
要访问数组元素,你必须使用[]
或者你没有看到那么多,但你也可以使用的是{}
。
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;
注意:
如果你有一个无效的属性名称,你也必须小心! 所以要看到所有问题,你可以面对一个无效的属性名称看到这个问题/答案 。 尤其是如果你在属性名称的开头有数字的话。
您只能从课堂外访问具有公开可见性的属性。 否则(私有或受保护的),您需要一个方法或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'
我希望这给你一个粗略的想法,当它们嵌套在一起时,如何访问数组和对象。
注意:
如果它被称为数组或对象取决于variables的最外面的部分。 所以
[new StdClass]
是一个数组,即使它有(嵌套的)对象在它和$object->property = array();
是一个对象,即使它有(嵌套)数组。如果您不确定是否有对象或数组,只需使用
gettype()
。
如果有人使用另一种编码风格,不要让自己感到困惑:
//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)
在第一维意味着你将只有一个元素的关键( $key
) data
和值( $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)
在第二维意味着你将有三个元素与键( $key
) 0
和值( $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它们。
-
“隐藏”字符
有时候你的钥匙上有字符,在浏览器的第一眼看不到。 然后你问自己,为什么你不能访问元素。 这些字符可以是:制表符(
\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
-
如果您查看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];