如何访问数组/对象?
Posted
技术标签:
【中文标题】如何访问数组/对象?【英文标题】:How can I access an array/object? 【发布时间】:2015-08-21 06:06:32 【问题描述】:我有以下数组,当我执行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];
但这显示了我:
未定义0
注意:
我从 Facebook SDK 4 得到这个数组,所以我不知道原始数组结构。
作为示例,我如何从数组中访问值 email@saya.com
?
【问题讨论】:
1.你尝试过什么吗? 2.这是基本的php如何访问数组或对象 请展示一下你到目前为止所做的努力 更新的人,需要你的帮助:) @AlanEl-ninoMalmsteen 预期的输出是什么?$demo =
来自哪里? print_r
不会产生它。如果这真的是print_r
的结果,那么你可以写echo array_values($get_user)[0];
【参考方案1】:
要访问array
或object
,您如何使用两个不同的运算符。
Arrays
要访问数组元素,您必须使用[]
。
echo $array[0];
在较旧的 PHP 版本中,还允许使用 的替代语法:
echo $array0;
声明数组和访问数组元素的区别
定义数组和访问数组元素是两件不同的事情。所以不要混淆它们。
要定义一个数组,您可以使用 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;
Objects
要访问对象属性,您必须使用->
。
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
)
有了这个,你可以遍历任何你想要的维度,不管它是一个数组还是对象。
分析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。接下来我们看到,该数组被分配给一个具有对象的 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>
欲了解更多信息,请参阅:
常规(符号、错误)
Reference — What does this symbol mean in PHP? Reference - What does this error mean in PHP? PHP parse/syntax errors; and how to solve them属性名称问题
How can I access a property with an invalid name? How to access object properties with names like integers or invalid property names?【讨论】:
@AlanEl-ninoMalmsteen 您的预期输出是什么? @AlanEl-ninoMalmsteen 发布您的原始数组 @AlanEl-ninoMalmsteen 要获取电子邮件,请使用:echo $demo[2];
@Rizier123 刚才您将我的问题标记为重复,请您帮忙获取数组值。
我喜欢 Dont' let PHP troll you
的部分 :))【参考方案2】:
我编写了一个小函数来访问数组或对象中的属性。我用了很多,觉得很方便
/**
* 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;
【讨论】:
嘿@ntheorist!这个问题已有 4 年多的历史了 - 如果您想将精力集中在新问题上,您可以使用“最新”选项卡来实现这一目标。例如,this 是最新 PHP 问题的链接。【参考方案3】:你可以使用
$ar = (array) $get_user;
然后您可以按数组方式访问它们的索引:
echo $ar[0];
【讨论】:
【参考方案4】:从问题中我们看不到输入数组的结构。可能是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
【讨论】:
为什么是array_values()
?!这里完全没有必要
@AlanEl-ninoMalmsteen 哇,这只是告诉我,你甚至没有阅读我的答案..
@Rizier123 在投反对票之前,您可能认为我们不知道数组结构的问题,只是看 print_r(array_values()) 的结果,也许是数组 ("a'=>'b". .. 但是 array_values[0] 在任何情况下都会是 'b'
@splash58 您在 OP 的回答中非常清楚地看到了数组结构。你甚至没有说,array_values()
做了什么。
我没有看到数组的结构。你错了。关于你现在的价值观【参考方案5】:
如果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]
【讨论】:
以上是关于如何访问数组/对象?的主要内容,如果未能解决你的问题,请参考以下文章