PHP: Как получить доступ к цепочке объектов json с дефисными именами

Ссылаясь на этот вопрос …

Как мне получить доступ к этому свойству объекта с дефисом?

… У меня есть еще один:

Я хочу получить доступ к свойству json, которое сохраняется в переменной … что-то вроде …

$var = '$obj->my-prop';

ЕСЛИ это было бы просто

$var = 'my-prop'

… Я мог бы решить проблему с дефисом, назвав его через

$obj->{$var}

что привело бы к

$obj->{'my-prop'}

… как сказано в предыдущем вопросе.

НО: Моя переменная также содержит предыдущее значение объекта (‘$ obj’). Поскольку его вызов через {$ var} приводит к {‘$ obj-> my-prop’}, что недопустимо, единственный способ решить его — это взорвать (‘->’, $ var) и затем объединить его , который беспорядок.

Кто-нибудь знает «решение idéale»? 🙂


РЕДАКТИРОВАТЬ:
поэтому решение idéale of one должно решить вопрос о том, сохранять ли этот синтаксис литерального объекта, сохраняя переменную как строку, которая выглядит (!) как объект. поэтому функция unpackPath в h2ooooooo будет правильной.
В отличие от этого, сохранение этой переменной в цепочке в виде массива (как сказал ToBe) откроет более подходящий для системы способ обработки данных. Json_decode строка типа ‘a-> b’ не возможна.

-1

Решение

Вы должны сделать свой собственный парсер (используя eg. explode() как вы упомянули).

Настроить:

<?php

class Foo {
public $bar;

public function __construct() {
$this->bar = new Bar();
}
}

class Bar {
public $oof;

public function __construct() {
$this->oof = new Oof();
}
}

class Oof {
public $id = 123;
}

function unpackPath($object, $path) {
if (is_string($path)) {
$path = explode('->', $path);
}

$value = $object->{$path[0]};

if (count($path) == 1) {
return $value;
} else {
return unpackPath($value, array_slice($path, 1));
}
}

Использование:

$foo = new Foo();
var_dump( unpackPath($foo, 'bar->oof->id') ); // int(123)

DEMO.

Обратите внимание, что вы должны определить свой начальный объект ($foo) чтобы не использовать глобальные переменные.

1

Другие решения

Других решений пока нет …