如何访问数组/对象?


72

我有以下数组,当我做得到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如何访问数组或对象的方法
Rizier123

请显示您到目前为止所做的努力
Narendrasingh Sisodia 2015年

更新的家伙,需要您的帮助:)
Muhamad Yulianto 2015年

2
@ AlanEl-ninoMalmsteen预期的输出是多少?
Rizier123

从哪里来$demo =print_r不产生它。如果真的是这样的结果,print_r那么您可以写出echo array_values($get_user)[0];
58

Answers:


119

要访问arrayobject您如何使用两个不同的运算符。

数组

要访问数组元素,您必须使用,[]或者您不会看到太多,但也可以使用is {}

echo $array[0];
echo $array{0};
//Both are equivalent and interchangeable

声明数组和访问数组元素之间的区别

定义数组和访问数组元素是两件事。所以不要把它们混在一起。

要定义一个数组,可以使用array()或对于PHP> = 5.4[]并分配/设置一个数组/元素。当您使用[]{}如上所述访问数组元素时,将获得与设置元素相反的数组元素的值。

//声明一个数组
$ arrayA = array( / *这里有一些东西* /  ;
$ arrayB = [ / *这里有些东西* / ]//仅适用于PHP> = 5.4

//访问数组元素
echo $ array [ 0 ] ;
回声$ array { 0 } ;

访问数组元素

要访问数组中的特定元素,可以使用内部的任何表达式,[]或者{}将其求值为要访问的键:

$ array [ (任何表达式) ]

因此,请注意使用什么表达式作为键,以及如何由PHP解释它:

echo $ array [ 0 ]; //键是一个整数;它访问0的元素
echo $ array [ “ 0” ]; //键是一个字符串;它访问0的元素
echo $ array [ “ string” ]; //键是一个字符串;它使用键“ string”访问元素
echo $ array [ CONSTANT ]; //键是一个常量,它被替换为对应的值
echo $ array [ cOnStAnT ]; //键也是常量而不是字符串
echo $ array [ $ anyVariable ] //键是一个变量,它被替换为'$ anyVariable'中的值
echo $ array [ functionXY() ]; //键将是函数
的返回值

访问多维数组

如果彼此之间有多个数组,则只需一个多维数组。要访问子数组中的数组元素,只需使用multiple即可[]

echo $array["firstSubArray"]["SecondSubArray"]["ElementFromTheSecondSubArray"]
         // ├─────────────┘  ├──────────────┘  ├────────────────────────────┘
         // │                │                 └── 3rd Array dimension;
         // │                └──────────────────── 2d  Array dimension;
         // └───────────────────────────────────── 1st Array dimension;

对象

要访问对象属性,必须使用->

echo $ object- >属性;

如果在另一个对象中有一个对象,则只需使用多个->即可获得对象属性。

echo $objectA->objectB->property;

注意:

  1. 另外,如果您拥有无效的属性名称,也必须小心!因此,要查看所有问题,您可能会遇到一个无效的属性名称,请参阅此问题/答案。如果您在属性名称的开头有数字,则尤其要注意这一点

  2. 您只能从班级外部访问具有公共可见性的属性。否则(私有或受保护的),您需要一个方法或反射,可以用来获取属性的值。

数组与对象

现在,如果您将数组和对象相互混合,则只需查看是否现在访问数组元素或对象属性并为其使用相应的运算符即可。

//目的
echo $ object-> anotherObject-> propertyArray [“ elementOneWithAnObject”]-> property;
    //├────┘├──────────┘├───────────┘├───────────── ────────┘├──────┘
    //││││└──属性; 
    //│││└──────────────────────────数组元素(对象);使用->访问属性“ property”
    //││└────────────────────数组(财产);使用[]访问数组元素'elementOneWithAnObject'
    //│└──────────────────────────── ────────────属性(对象);使用->访问属性'propertyArray'
    //└────────────────────────────── ────────────────────对象;使用->访问属性“ anotherObject”


//数组
echo $ array [“ arrayElement”] [“ anotherElement”]-> object-> property [“ element”];
    //├───┘├──────────┘├──────────────├────┘├────── ├├───────┘
    //│││││└──数组元素; 
    //││││└────────────属性(数组);使用[]访问数组元素'element'
    //│││└────────────────────属性(对象);使用->访问属性“ property”
    //││└────────────────数组元素(对象);使用->访问属性“对象”
    //│└──────────────────────────── ────────数组元素(array); 使用[]访问数组元素'anotherElement'
    //└────────────────────────────── ──────────────数组;使用[]访问数组元素'arrayElement'

我希望这给您一个大概的想法,当它们相互嵌套时如何访问数组和对象。

注意:

  1. 是否调用数组或对象取决于变量的最外部。所以[new StdClass]是一个阵列,即使它已(嵌套)对象内的,并$object->property = array();是一个对象,即使它已(嵌套)阵列内。

    如果不确定是否有对象或数组,请使用 gettype()

  1. 如果有人使用您以外的其他编码样式,请不要感到困惑:

    //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)

这意味着在第一维中,您只有一个带有key($keydata和value($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个元素与键($key012和值($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()输出

所有这三个调试功能都输出相同的数据,只是以另一种格式或带有一些元数据(例如,类型,大小)。因此,在这里我想展示如何读取这些函数的输出,以了解/了解如何从数组/对象访问某些数据。

输入数组:

$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,则可以从值本身开始,您要访问该值,然后逐步到达“左上角”。

1.我们首先看到,值2在键为1的数组中

array(3){   // var_dump()
  [0] =>
  整数(1)
  [1] =>
  整数(2)
  [2] =>
  整数(3)
}

数组  // print_r()
(
  [0] => 1
  [1] => 2
  [2] => 3

数组(   // var_export()
  0 => 1
  1 => 2
  2 => 3,
),

这意味着我们必须使用[]/通过{}来访问值2 [1],因为该值具有键/索引1。

2.接下来,我们看到将数组分配给具有对象名称属性的属性

对象(stdClass)#1(1){   // var_dump()
   [“ property”] =>
    / *此处数组* /
}

stdClass对象  // print_r()
 
  [property] => / *此处为数组* /
 

stdClass :: __ set_state  array(// var_export()
   'property' =>
    / *此处数组* /
)

这意味着我们必须使用->访问对象的属性,例如->property

所以直到现在我们知道,我们必须使用->property[1]

3.最后,我们看到最外面的是一个数组

array(1){   // var_dump()
   [“ key”] =>
    / *对象和数组在这里* /
}

数组  // print_r()
 
  [key] =>
    / *对象和数组在这里* /

数组(   // var_export()
   'key' =>
    / *对象和数组在这里* /

如我们所知,我们必须使用来访问数组元素[],我们在这里看到我们必须使用["key"]来访问对象。现在,我们可以将所有这些部分放在一起并编写:

echo $array["key"]->property[1];

输出将是:

2

不要让PHP欺骗您!

您需要了解一些事情,这样您就不必花费大量时间在上面就可以找到它们。

  1. “隐藏”字符

    有时,您的按键中包含字符,这些字符在浏览器的第一次外观中不会出现。然后您问自己,为什么无法访问该元素。这些字符可以是:标签(\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
    
  2. 永远不要相信XML的输出,print_r()或者var_dump()如果您看XML

    您可能将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的属性。因此,正如我说永远不要相信的输出var_dump()print_r()当你有一个XML对象。始终用于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>
    

有关更多信息,请参见:

常规(符号,错误)

物业名称问题


@ AlanEl-ninoMalmsteen您的预期输出是多少?
Rizier123

@ AlanEl-ninoMalmsteen发布您的原始数组
Narendrasingh

@ AlanEl-ninoMalmsteen要获取电子邮件,请使用:echo $demo[2];
Rizier123

@ Rizier123刚才您将我的问题标记为重复,请帮忙获取数组值。
Mujahidh '16

1
我喜欢这个部分Dont' let PHP troll you:))
cat_minhv0

7

从这个问题我们看不到输入数组的结构。也许吧array ('id' => 10499478683521864, 'date' => '07/22/1983')。因此,当您询问$ demo [0]时,将使用未定义索引。

Array_values丢失了键,并返回带有多个键的数组,从而使数组成为array(10499478683521864, '07/22/1983'...)。我们在问题中看到了这个结果。

因此,您可以通过相同的方式获取数组项的值

echo array_values($get_user)[0]; // 10499478683521864 

为什么array_values()呢?此处完全不需要
Rizier123,2015年

1
@ AlanEl-ninoMalmsteen哇,这只是表明我,你甚至没有看我的答案..
Rizier123

@ Rizier123在投反对票之前,您可能会认为我们从问题上不知道数组的结构,只是看着print_r(array_values())的结果,也许数组(“ a'=>'b” ...但array_values [0]会在任何情况下
均为

1
@ splash58您会在OP的答案中看到非常清晰的数组结构。而且您甚至都不会说,是什么array_values()
Rizier123

我看不到数组的结构。你错了。关于您现在才是正确的价值观
2015年

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]


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;
  }
}

嘿@ntheorist!这个问题已有4年之久了-如果您想将精力集中在新问题上,可以使用“最新”标签来实现。例如,是最新PHP问题的链接。
zbee

-1

您可以使用

$ar = (array) $get_user;

那么您就可以按顺序访问它们的索引:

echo $ar[0];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.