要访问array 或object,您如何使用两个不同的运算符。
要访问数组元素,您必须使用[]。
echo $array[0];
在较旧的 PHP 版本中,还允许使用 {} 的替代语法:
echo $array{0};
声明数组和访问数组元素的区别
定义数组和访问数组元素是两件不同的事情。所以不要混淆它们。
要定义一个数组,您可以使用 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];
访问数组元素
要访问数组中的特定元素,您可以使用 [] 或 {} 中的任何表达式,然后计算出您要访问的键:
$array[(任意表达式)]
所以请注意您使用什么表达式作为键以及它是如何被 PHP 解释的:
回声 $array[0]; //键是一个整数;它访问 0 的元素
回声 $array["0"]; //键是一个字符串;它访问 0 的元素
回声 $array["字符串"]; //键是一个字符串;它使用键“字符串”访问元素
回声 $array[CONSTANT]; //键是一个常量,它被对应的值替换
回声 $array[cOnStAnT]; //键也是一个常量而不是字符串
echo $array[$anyVariable] //键是一个变量,它被'$anyVariable'中的值替换
回声 $array[functionXY()]; //键是函数的返回值
访问多维数组
如果你有多个数组,那么你只需要一个多维数组。要访问子数组中的数组元素,您只需使用多个[]。
echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"]
// ├─────────────┘ ├──────────────┘ ├────────────────────────────┘
// │ │ └── 3rd Array dimension;
// │ └──────────────────── 2d Array dimension;
// └───────────────────────────────────── 1st Array dimension;
要访问对象属性,您必须使用->。
echo $object->property;
如果你在另一个对象中有一个对象,你只需要使用多个-> 来获取你的对象属性。
echo $objectA->objectB->property;
注意:
-
此外,如果您的属性名称无效,您必须小心!因此,要查看所有问题,您可能会遇到无效属性名称,请参阅此question/answer。尤其是this one,如果属性名称的开头有数字。
-
您只能从类外部访问具有公共visibility 的属性。否则(私有或受保护)您需要一个方法或反射,您可以使用它来获取属性的值。
数组和对象
现在,如果您将数组和对象混合在一起,您只需要查看您现在是否访问数组元素或对象属性并使用相应的运算符。
//对象
echo $object->anotherObject->propertyArray["elementOneWithAnObject"]->property;
//├────┘ ├────────────┘ ├────────────┘ ├────────────── ────────┘ ├──────┘
//│ │ │ │ └── 属性;
//│ │ │ └──────────────────────────────数组元素(对象);使用 -> 来访问属性 'property'
//│ │ └─────────────────────────────────────────数组(财产) ;使用 [] 来访问数组元素 'elementOneWithAnObject'
//│ └────────────────────────────────────────────── ──────────── 属性(对象);使用 -> 来访问属性 'propertyArray'
//└─────────────────────────────────────────────── ──────────────────── 对象;使用 -> 来访问属性 'anotherObject'
//大批
echo $array["arrayElement"]["anotherElement"]->object->property["element"];
//├───┘ ├────────────┘ ├──────────────┘ ├────┘ ├────── ┘ ├────────┘
//│ │ │ │ │ └── 数组元素;
//│ │ │ │ └─────────── 属性(数组);使用 [] 来访问数组元素 'element'
//│ │ │ └─────────────────── 属性(对象);使用 -> 来访问属性 'property'
//│ │ └──────────────────────────────────── 数组元素(对象);使用 -> 来访问属性 'object'
//│ └────────────────────────────────────────────── ──────── 数组元素(数组);使用 [] 来访问数组元素 'anotherElement'
//└─────────────────────────────────────────────── ────────────── 数组;使用 [] 来访问数组元素 'arrayElement'
我希望这能让您大致了解当数组和对象相互嵌套时如何访问它们。
注意:
-
是否调用数组或对象取决于变量的最外层部分。所以 [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 as $key => $value)
意味着在第一个维度中,您将只有 1 个元素,其键为 ($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)
意味着在第二维中,您将拥有 3 个元素,其中包含键 ($key) 0、1、2 和值 ($value):
stdClass Object ( //Key: 0
[propertyXY] => 1
)
stdClass Object ( //Key: 1
[propertyXY] => 2
)
stdClass Object ( //Key: 2
[propertyXY] => 3
)
有了这个,你可以遍历任何你想要的维度,不管它是一个数组还是对象。
所有这 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' =>
(object) array(
'property' =>
array (
0 => 1,
1 => 2,
2 => 3,
),
),
)
所以你可以看到所有的输出都非常相似。如果您现在想要访问值 2,您可以从想要访问的值本身开始,然后一直到“左上角”。
1。我们首先看到,值 2 在一个键为 1 的数组中
// var_dump()
array(3) {
[0]=>
int(1)
[1]=>
int(2) // <-- value we want to access
[2]=>
int(3)
}
// print_r()
Array
(
[0] => 1
[1] => 2 // <-- value we want to access
[2] => 3
)
// var_export()
array (
0 => 1,
1 => 2, // <-- value we want to access
2 => 3,
)
这意味着我们必须使用 [] 通过 [1] 访问值 2,因为该值的键/索引为 1。
2。接下来我们看到,该数组被分配给一个具有对象的 name 属性的属性
// var_dump()
object(stdClass)#1 (1) {
["property"]=>
/* Array here */
}
// print_r()
stdClass Object
(
[property] => /* Array here */
)
// var_export()
(object) array(
'property' =>
/* Array here */
),
这意味着我们必须使用-> 来访问对象的属性,例如->property。
所以到目前为止,我们知道我们必须使用 ->property[1]。
3。最后我们看到,最外层是一个数组
// var_dump()
array(1) {
["key"]=>
/* Object & Array here */
}
// print_r()
Array
(
[key] => stdClass Object
/* Object & Array here */
)
// var_export()
array (
'key' =>
/* Object & Array here */
)
我们知道我们必须使用[] 访问一个数组元素,我们在这里看到我们必须使用["key"] 来访问该对象。我们现在可以将所有这些部分放在一起并编写:
echo $array["key"]->property[1];
输出将是:
2
不要让 PHP 欺骗你!
有几件事是你必须知道的,这样你就不用花几个小时去寻找它们。
-
“隐藏”字符
有时您的键中有字符,而您在浏览器中第一次看时看不到这些字符。然后你问自己,为什么你不能访问元素。这些字符可以是:制表符(\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 文件或字符串加载到对象中,例如
<?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
)
)
如您所见,您看不到 title 的属性。所以正如我所说,当你有一个 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>
欲了解更多信息,请参阅:
常规(符号、错误)
属性名称问题