我有以下数组,当我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 获取此数组,因此我不知道原始阵列结构。
如何从数组中以值email@saya.com
作为示例进行访问?
答案 0 :(得分:86)
要访问array
或object
,您需要了解如何使用两个不同的运算符。
要访问数组元素,您必须使用[]
或者您没有看到那么多,但您也可以使用{}
。
echo $array[0];
echo $array{0};
//Both are equivalent and interchangeable
定义数组和访问数组元素是两回事。所以不要混淆它们。
要定义数组,您可以使用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]; echo $array{0};
要访问数组中的特定元素,您可以使用[]
或{}
中的任何表达式,然后评估您要访问的键:
$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;
注意:强>
如果您的商标名称无效,您还必须小心!因此,要查看使用无效的属性名称可能遇到的所有问题,请参阅此question/answer。如果您在属性名称的开头有数字,尤其是this one。
- 醇>
您只能从课堂外访问公开visibility的媒体资源。否则(私有或受保护)您需要一个方法或反射,您可以使用它来获取属性的值。
现在,如果您有相互混合的数组和对象,您只需查看现在是否访问数组元素或对象属性并使用相应的运算符。
//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();
是< strong> object 即使它内部有(嵌套)数组。如果您不确定是否有对象或数组,请使用
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' =>
stdClass::__set_state(array(
'property' =>
array (
0 => 1,
1 => 2,
2 => 3,
),
)),
)
因此,您可以看到所有输出非常相似。如果您现在想要访问值2,您可以从您想要访问的值本身开始,然后前往&#34;左上角&#34;。
1。我们首先看到,值2在一个数组中,键1
array(3) { //var_dump() [0]=> int(1) [1]=> int(2) [2]=> int(3) }
Array //print_r() ( [0] => 1 [1] => 2 [2] => 3 )
array ( //var_export() 0 => 1, 1 => 2, 2 => 3, ),
这意味着我们必须使用[]
/ {}
通过 [1]
访问值2,因为该值具有键/索引1。 / p>
2。接下来我们看到,数组被分配给具有对象的name属性的属性
object(stdClass)#1 (1) { //var_dump() ["property"]=> /* Array here */ }
stdClass Object //print_r() ( [property] => /* Array here */ )
stdClass::__set_state(array( //var_export() 'property' => /* Array here */ )),
这意味着我们必须使用->
来访问对象的属性,例如的 ->property
强>
所以,直到现在我们知道,我们必须使用 ->property[1]
。
3。最后我们看到,最外层是一个数组
array(1) { //var_dump() ["key"]=> /* Object & Array here */ }
Array //print_r() ( [key] => /* Object & Array here */ )
array ( //var_export() 'key' => /* Object & Array here */ )
我们知道我们必须使用[]
访问数组元素,我们在这里看到我们必须使用 ["key"]
来访问该对象。我们现在可以将所有这些部分放在一起并写下:
echo $array["key"]->property[1];
输出将是:
2
有一些事情需要你知道,以免你花费数小时找到它们。
&#34;隐藏&#34;字符
有时候你的按键上有字符,在浏览器的第一眼看上去就看不到。然后你问自己,为什么你无法访问该元素。这些字符可以是:制表符(\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
)
)
因为你可以看到你没有看到标题的属性。正如我所说的那样,当你有一个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>
有关详细信息,请参阅:
常规(符号,错误)
财产名称问题
答案 1 :(得分:8)
从这个问题我们看不到输入数组的结构。它可能是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
答案 2 :(得分:2)
如果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]
答案 3 :(得分: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;
}
}
答案 4 :(得分:-1)
你可以使用
$ar = (array) $get_user;
然后你可以arra-wise访问他们的索引:
echo $ar[0];