提问人:Muhamad Yulianto 提问时间:6/6/2015 最后编辑:RahulMuhamad Yulianto 更新时间:4/27/2022 访问量:145251
如何访问数组/对象?
How can I access an array/object?
问:
我有以下数组,当我这样做时,我得到:print_r(array_values($get_user));
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
)
我尝试按如下方式访问数组:
echo $get_user[0];
但这向我展示了:
未定义 0
注意:
我从 Facebook SDK 4 获取此数组,因此我不知道原始数组结构。
如何以数组中的值为例访问?[email protected]
答:
要访问或您如何使用两个不同的运算符。array
object
阵 列
要访问数组元素,您必须使用 .[]
echo $array[0];
在较旧的PHP版本上,还允许使用替代语法:{}
echo $array{0};
声明数组和访问数组元素之间的区别
定义数组和访问数组元素是两回事。所以不要把它们混为一谈。
要定义一个数组,您可以使用 或 对于 PHP >=5.4,您可以分配/设置一个数组/元素。当您使用上述方式访问数组元素时,您将获得数组元素的值,而不是设置元素。array()
[]
[]
//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];
Access 数组元素
要访问数组中的特定元素,您可以使用内部的任何表达式,或者然后计算为要访问的键:[]
{}
$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;
对象
要访问对象属性,您必须使用 .->
echo $object->property;
如果另一个对象中有一个对象,则只需使用多个对象即可访问对象属性。->
echo $objectA->objectB->property;
注意:
另外,如果你有一个无效的属性名称,你必须小心!因此,要查看所有问题,您可能会遇到无效的属性名称,请参阅此问题/答案。尤其是这个,如果你的属性名称的开头有数字。
您只能从类外部访问具有公共可见性的属性。否则(私有或受保护),您需要一个方法或反射,您可以使用它来获取属性的值。
数组和对象
现在,如果数组和对象相互混合,则只需查看现在是否访问数组元素或对象属性,并为其使用相应的运算符即可。
//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'
我希望这能让你大致了解当数组和对象相互嵌套时如何访问它们。
注意:
如果调用它,数组或对象取决于变量的最外层部分。因此
,[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() 和 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)
这意味着在第二个维度中,您将有 3 个元素,其中包含 keys() 、 和 values():$key
0
1
2
$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' =>
(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. 接下来我们看到,数组被分配给一个具有对象名称属性的属性
// var_dump()
object(stdClass)#1 (1) {
["property"]=>
/* Array here */
}
// print_r()
stdClass Object
(
[property] => /* Array here */
)
// var_export()
(object) array(
'property' =>
/* Array here */
),
这意味着我们必须使用 to 访问对象的属性,例如 ->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欺骗你!
有几件事,你必须知道,这样你就不会花几个小时去寻找它们。
“隐藏”字符
有时,您的键中有字符,您在浏览器中第一次查看时看不到这些字符。然后你问自己,为什么你不能访问这个元素。这些字符可以是:制表符()、换行符()、空格或html标签(例如,)等。
\t
\n
</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 的输出,或者如果你看 XML
print_r()
var_dump()
您可能已将 XML 文件或字符串加载到对象中,例如
<?xml version="1.0" encoding="UTF-8" ?> <rss> <item> <title attribute="xy" ab="xy">test</title> </item> </rss>
现在,如果您使用 OR,您将看到:
var_dump()
print_r()
SimpleXMLElement Object ( [item] => SimpleXMLElement Object ( [title] => test ) )
所以正如你所看到的,你没有看到标题的属性。因此,正如我所说,永远不要相信 XML 对象的输出。始终使用
asXML()
查看完整的 XML 文件/字符串。var_dump()
print_r()
因此,只需使用如下所示的方法之一:
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>
有关详细信息,请参阅:
常规(符号、错误)
属性名称问题
评论
从问题中我们看不到输入数组的结构。也许.因此,当您询问 $demo[0] 时,您使用 undefind index。array ('id' => 10499478683521864, 'date' => '07/22/1983')
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 protected] ) )
然后做$var['demo'][0]
如果输出为:print_r($var)
Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => [email protected] )
然后做$var[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;
}
}
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'>:::Exception Start:::</font><br>Invalid Object/Array Passed at kPrint() Function!!<br> At : Variable => ".print_r($obj)."<br>Key => ".$key."<br> At File: <font color='blue'>".debug_backtrace()[0]['file']."</font><br> At Line : ".debug_backtrace()[0]['line']."<br><font color='green'>:::Exception End:::</font></font>")));}
每当想要访问数组或对象中的项时,都可以调用此函数。此函数按键从数组/对象中打印相应的值。
评论
在调用响应数据之前,我将假设您的数据是关联的,它看起来有点像这样:array_values()
[
'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
]
重新索引有效负载的键没有任何好处。如果您打算将数据转换为数组,则可以通过使用 ,否则 解码 json 字符串即可完成。json_decode($response, true)
json_decode($response)
如果您尝试将对象作为对象传递到 ,则从 PHP8 将生成 。$response
array_values()
Fatal error: Uncaught TypeError: array_values(): Argument #1 ($array) must be of type array, stdClass given
在上面提供的数据结构中,有一个带有关联键的数组。
- 若要访问特定的第一级元素,请使用带有引号的字符串键的“方括号”语法。
$response['id']
访问10499478683521864
$response['gender']
访问male
$response['location']
访问(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
- 要访问嵌套在(第二级)中的数据,需要“箭头语法”,因为数据是一个对象。
location
$response['location']->id
访问102173722491792
$response['location']->name
访问Jakarta, Indonesia
调用响应后,该结构是一个索引数组,因此请使用带有不带引号的整数的方括号。array_values()
$response[0]
访问10499478683521864
$response[4]
访问male
$response[7]
访问(object) ['id' => 102173722491792, 'name' => 'Jakarta, Indonesia']
$response[7]->id
访问102173722491792
$response[7]->name
访问Jakarta, Indonesia
当您不确定正在使用的数据类型时,请使用 var_export()
或 var_dump()。
如果对象属性(键)包含非法字符,或者存在与键冲突的紧随字符(请参阅:1、2、3),请将键括在引号和大括号(或整数仅括大括号)中,以防止语法中断。
如果要遍历数组或对象中的所有元素,则 a 适用于两者。foreach()
代码:(演示)
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";
}
}
}
输出:
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
评论