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