Как обращаться к подмассиву PHP

D
На сайте с 28.06.2008
Offline
980
159

Есть массив

array(1) {
  [0]=>
  object(stdClass)#614 (7) {
    ["gz"]=>
    array(2) {

Нужно обратиться к подмассиву ["gz"] и я вечно туплю в этом моменте, сначала пробую так

$json[0]["gz"]

не срабатывает (иногда в других случаях срабатывает), потом пробую так

$json[0]->gz

Я забыл или не знал - как понять сразу что нужно писать скобки или стрелку?

SS
На сайте с 28.05.2008
Offline
118
#1
Если Object, то стрелку, если просто массив, то скобки.
MK
На сайте с 18.08.2005
Offline
126
#2
Dram :
Нужно обратиться к подмассиву

Что то типа того:

<?php

function _a( string $k, $o=null, $def=null ){
  if(is_object($o)) {
    return property_exists($o,$k) ? $o->$k : $def;
  } elseif (is_array($o)){
    return array_key_exists($k,$o) ? $o[$k] : $def;
  } else return $def;
}

function _n( $o, string $k, $def='То, что никогда не встретится в ваших массивах/объектах'){
  $k = explode('.', $k);
  foreach($k as $v){  
    $o = is_iterable($o) || $o instanceof stdClass ? _a($v, $o, $def) : $o;
    if($def===$o)   return $def;
  }  
  return $o;
}

$o = json_decode('[{"gz":["qeqwe","qeqeqe"]},{"gz0":["qeqwe",{"aa":"bb"}]}]');
$ns = '0.gz';
echo "\nResult for key '{$ns}': \n", var_dump(_n($o, $ns)), "\n";

Немного строчек кода позволят обращаться к  масссиву/объекту в стиле:  '0.gz'


$ php -f /var/web/d.php

Result for key '1.gz0.1.aa.00':
string(101) "То, что никогда не встретится в ваших массивах/объектах"

$ php -f /var/web/d.php

Result for key '1.gz0.1.aa':
string(2) "bb"

$ php -f /var/web/d.php

Result for key '0.gz':
array(2) {
  [0]=>
  string(5) "qeqwe"
  [1]=>
  string(6) "qeqeqe"
}
нет
S
На сайте с 13.10.2014
Offline
148
#3

О май... Что это за индокод...
если у вас в перемешку массивы и объекты то можете все преобразовать в массив и не заморачиваться
$array = json_decode(json_encode($mixed),TRUE);

на выходе будет обычный ассоциативный массив.
в случае ТС $array[0]['gz'];

MK
На сайте с 18.08.2005
Offline
126
#4
silicoid #:
$array = json_decode(json_encode($mixed),TRUE);

Категорически неверный подход: Прилетел 10000 таких:

$o = json_decode('[{"gz":["qeqwe","qeqeqe", 20]},{"gz0":["qeqwe",{"aa":"bb"}]}]');
$oo = [];

for($i=0;$i<10000;$i++){
$oo[$i] = $o;
}

$t = microtime(1);
$oo = json_decode(json_encode($oo),TRUE);
echo (microtime(1) - $t)*1000, 'ms';

$t = microtime(1);
$ns = '557.0.gz.2';
echo "\nResult for key '{$ns}': \n", var_dump(_n($oo, $ns)), "\n";
echo (microtime(1) - $t)*1000, 'ms', "\n";
57.188987731934ms
Result for key '557.0.gz.2':
int(20)

0.051975250244141ms

57 миллисек это  очень много, а еще  и на  memory_get_usage/memory_get_peak_usage  любопытно было бы посмотреть. Ну,  чтобы  вывод о том кто индокодит


Вот это:

$array = json_decode(json_encode($mixed),TRUE); 

зло. Никогда так не делайте

S
На сайте с 13.10.2014
Offline
148
#5

Индокод, это когда пишут 50 строк, вместо того, чтоб написать одну.
Понятно что прямое и обратное преобразование в json очень ресурсоемкая задача, НО  как на входе, так и на выходе имеет стандартный синтаксис, а не какой-то придуманный именно вами и не используемый нигде более в языке.

Когда вы пишете какой-то код, надо еще и понимать, что за вами его будет кто-то разбирать, поэтому использование таких вот конструкций

1.gz0.1.aa.00

недопустимо

MK
На сайте с 18.08.2005
Offline
126
#6
silicoid #:

стандартный синтаксис, а не какой-то придуманный именно вами и не используемый нигде более в языке.

Когда вы пишете какой-то код, надо еще и понимать, что за вами его будет кто-то разбирать, поэтому использование таких вот конструкций

недопустимо

Недопустимо кому? Это всего лишь функция, облегчающая доступ к элементам массива/объекта. Не более того. Всяких разных функции/классов в любом проекте может быть от много до очень много.  И разбирать их приходится, хочется того или нет.

Что касается $array[0]['gz']

print($o['3a']);
#PHP Notice:  Undefined index: 3a in /var/web/d.php on line 21

А у меня бзик🤪 - все ошибки вызывают Exception, просто никаких варнинго-нотисов не люблю. И предпочитаю приложить немного усилий, чтобы исключить их

MK
На сайте с 18.08.2005
Offline
126
#7
Marat_Kh #:
А у меня бзик🤪 - все ошибки вызывают Exception,

Кстати, такой подход, позволяет с пониманием относиться к этому:

$ python3
Python 3.6.8 (default, Apr  2 2020, 13:34:55)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> o={'sd':1}
>>> print(o['dd'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>

KeyError: 'dd'
>>> print(o.get('dd'))
None
>>> print(o.get('dd',{}))
{}
S3
На сайте с 29.03.2012
Offline
221
#8
Marat_Kh #:

Кстати, такой подход, позволяет с пониманием относиться к этому:

Ну так этоже пайтон, он же для людей) собственно под капотом get  и есть обработка исключений при работе со словарями

N
На сайте с 10.12.2012
Offline
59
#9
$json[0]->gz

Такой код должен быть в твоем случае.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий