У меня есть следующий массив, и когда я делаю 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;
Заметка:
Также вы должны быть осторожны, если у вас есть недопустимое имя свойства! Поэтому, чтобы увидеть все проблемы, с которыми вы можете столкнуться с недопустимым именем свойства, см. Этот вопрос / ответ . И особенно этот, если у вас есть номера в начале имени свойства.
Доступ к свойствам возможен только с открытой видимости за пределами класса. В противном случае (частный или защищенный) вам нужен метод или отражение, которое вы можете использовать для получения значения свойства.
Теперь, если у вас есть массивы и объекты, смешанные друг с другом, вам просто нужно посмотреть, можете ли вы теперь получить доступ к элементу массива или свойству объекта и использовать для него соответствующий оператор.
// Объект echo $ object-> anotherObject-> propertyArray ["elementOneWithAnObject"] -> свойство; // ├─────┘ ├────────────────────────────────────────────────────────────────────────────────────────────── ──────┘ ├─────── // │ │ │ │ └── собственность; // Элемент (объект) массива │ │ │ └────────────────────────────────────────────────────────── Использование -> Чтобы получить доступ к свойству property ' // │ │ └─────────────────────────────────────────────────────────────────────────────────────────────── ( имущество) ; Используйте [] Чтобы получить доступ к элементу массива elementOneWithAnObject, // │ └───────────────────────────────────────────────────────────────────────────────────────────────── ─────────── собственность (объект); Использовать -> Чтобы получить доступ к свойству propertyArray, // └─────────────────────────────────────────────── Объект ────────────────────────────────────────── Use -> Чтобы получить доступ к свойству 'anotherObject' // Массив echo $ array ["arrayElement"] ["anotherElement"] -> object-> свойство ["element"]; // ├─────┘ ┘ ├────────┘ // │ │ │ │ │ └── элемент массива; // Свойство (массив); Используйте [] Чтобы получить доступ к элементу элемента массива, // │ │ │ └────────────────────────────────────────────────────────; Использование -> Чтобы получить доступ к свойству property ' // Элемент (объект) массива │ │ └─────────────────────────────────────────────────────────────────────────────── Использовать -> Чтобы получить доступ к объекту 'свойство' // │ └───────────────────────────────────────────────────────────────────────────────────────────────── ─────── элемент массива (массив); Используйте [] Чтобы получить доступ к элементу массива '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"] как $ 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
Есть несколько вещей, которые вы должны знать, чтобы вы не часами тратили на это их поиск.
«Скрытые» персонажи
Иногда у вас есть символы в ваших ключах, которые вы не видите при первом взгляде в браузере. И тогда вы спрашиваете себя, почему вы не можете получить доступ к элементу. Этими символами могут быть: 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
Никогда не доверяйте 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>
Для получения дополнительной информации см .:
Общие (символы, ошибки)
Проблемы с именем свойства
Из вопроса мы не можем видеть структуру входного массива. Это может быть 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];