Как я могу получить доступ к массиву / объекту?

У меня есть следующий массив, и когда я делаю 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

Заметка:

Я получаю этот массив из SDK для Facebook , поэтому я не знаю исходный массив strucutre.

Как я могу получить в качестве примера значение email@saya.com из массива?

Чтобы получить доступ к array или object , как использовать два разных оператора.

Массивы

Чтобы получить доступ к элементам массива, вы должны использовать либо [] или которые вы не так много видите, но вы также можете использовать {} .

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

Разница между объявлением массива и доступом к элементу массива

Определение массива и доступ к элементу массива – это две разные вещи. Так что не смешивайте их.

Чтобы определить массив, вы можете использовать array() или для PHP> = 5.4 [] и вы назначаете / устанавливаете массив / -элемент. Когда вы обращаетесь к элементу массива с помощью [] или {} как указано выше, вы получаете значение элемента массива, противоположное заданию элемента.

  // Объявление массива
 $ arrayA = array ( / * Некоторые вещи здесь * / ) ;
 $ arrayB = [ / * Некоторые вещи здесь * / ] ;  // Только для PHP> = 5.4

 // Доступ к элементу массива
 echo $ array [ 0 ] ;
 echo $ 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 () ];  // Ключ будет возвратным значением функции

Доступ к многомерному массиву

Если у вас несколько массивов друг в друге, у вас просто есть многомерный массив. Чтобы получить доступ к элементу массива в дополнительном массиве, вам просто нужно использовать несколько [] .

 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 '
     // │ │ └─────────────────────────────────────────────────────────────────────────────────────────────── ( имущество) ;  Используйте [] Чтобы получить доступ к элементу массива elementOneWithAnObject,
     // │ └───────────────────────────────────────────────────────────────────────────────────────────────── ─────────── собственность (объект);  Использовать -> Чтобы получить доступ к свойству propertyArray,
     // └─────────────────────────────────────────────── Объект ──────────────────────────────────────────  Use -> Чтобы получить доступ к свойству 'anotherObject'


 // Массив
 echo $ array ["arrayElement"] ["anotherElement"] -> object-> свойство ["element"];
     // ├─────┘ ┘ ├────────┘
     // │ │ │ │ │ └── элемент массива; 
     // Свойство (массив);  Используйте [] Чтобы получить доступ к элементу элемента массива,
     // │ │ │ └────────────────────────────────────────────────────────;  Использование -> Чтобы получить доступ к свойству property '
     // Элемент (объект) массива │ │ └───────────────────────────────────────────────────────────────────────────────  Использовать -> Чтобы получить доступ к объекту 'свойство'
     // │ └───────────────────────────────────────────────────────────────────────────────────────────────── ─────── элемент массива (массив);  Используйте [] Чтобы получить доступ к элементу массива '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)

Значит здесь, в первом измерении, у вас будет только 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"] как $ 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()

Все эти три функции отладки выводят одни и те же данные только в другом формате или с некоторыми метаданными (например, тип, размер). Поэтому здесь я хочу показать, как вам нужно читать выходные данные этих функций, чтобы узнать / получить доступ к некоторым данным из вашего массива / объекта.

Входной массив:

 $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] =>
   INT (1)
   [1] => 
    Int (2)
   [2] =>
   Int (3)
 }

  Массив // print_r ()
 (
   [0] => 1
   [1] => 2
   [2] => 3
 )

  array ( // var_export ()
   0 => 1,
   1 => 2,
   2 => 3,
 ),

Это означает, что мы должны использовать [] / {} для доступа к значению 2 с помощью [1] , так как значение имеет ключ / индекс 1.

2. Далее мы видим, что массив присваивается свойству с свойством name объекта

  object (stdClass) # 1 (1) { // var_dump ()
   ["property"] =>
     / * Массив здесь * /
 }

  stdClass Object // print_r ()
 (
   [property] => / * Array здесь * /
 )

  stdClass :: __ set_state ( array (// var_export ()
   'property' => 
     / * Массив здесь * /
 ) ),

Это означает, что мы должны использовать -> для доступа к свойству объекта, например ->property .

Итак, до сих пор мы знаем, что мы должны использовать ->property[1] .

3. И в конце мы видим, что внешний – это массив

  array (1) { // var_dump ()
   ["key"] =>
     / * Объект и массив здесь * /
 }

  Массив // print_r ()
 (
   [key] => 
     / * Объект и массив здесь * /
 )

  array ( // var_export ()
   'key' =>
     / * Объект и массив здесь * /
 )

Поскольку мы знаем, что нам нужно получить доступ к элементу массива с помощью [] , мы видим здесь, что мы должны использовать ["key"] для доступа к объекту. Теперь мы можем объединить все эти части и написать:

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

И выход будет:

 2 

Не позволяйте PHP трогать вас!

Есть несколько вещей, которые вы должны знать, чтобы вы не часами тратили на это их поиск.

  1. «Скрытые» персонажи

    Иногда у вас есть символы в ваших ключах, которые вы не видите при первом взгляде в браузере. И тогда вы спрашиваете себя, почему вы не можете получить доступ к элементу. Этими символами могут быть: tabs ( \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. Никогда не доверяйте var_dump() 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 ) ) 

    Итак, вы можете видеть, что вы не видите атрибуты заголовка. Так как я сказал, что никогда не доверяю 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> 

Для получения дополнительной информации см .:

Общие (символы, ошибки)

  • Ссылка. Что означает этот символ в PHP?
  • Ссылка. Что означает эта ошибка в PHP?
  • Ошибки анализа / синтаксиса PHP; и как их решить?

Проблемы с именем свойства

  • Как я могу получить доступ к собственности с недопустимым именем?
  • Как получить доступ к свойствам объекта с именами, такими как целые числа?

Из вопроса мы не можем видеть структуру входного массива. Это может быть array ('id' => 10499478683521864, 'date' => '07/22/1983') . Поэтому, когда вы спрашиваете $ demo [0], вы используете индекс undefind.

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@saya.com ) ) 

затем выполните $var['demo'][0]

Если вывод print_r($var) , например:

  Array ( [0] => 10499478683521864 [1] => 07/22/1983 [2] => email@saya.com ) 

то do $var[0]

вы можете использовать

 $ar = (array) $get_user; 

то вы можете получить доступ к своим индексам:

 echo $ar[0];