Получение объекта в PHP по значению ключа - PullRequest
1 голос
/ 01 мая 2020

У меня есть очень большой объект, через который я должен пройти l oop, чтобы получить указанный c объект. Я пробовал foreach($obj as $item), foreach($obj as $item => $value) и for в различных конфигурациях.

Я хочу получить все объекты, для которых класс "реагирует на таблицы"

Мой элемент выглядит следующим образом (в JSON):

{
    "dummy":"dummytext",
    "children": [
        {
            "tag":null
        },
        {
            "tag":"body",
            "children": [
                {
                    "class":"not_the_one"
                },
                {
                    "class":"table-responsive",
                    "html":"Gotcha!"
                }
            ]
        }
    ]
}

В результате я хочу получить:

{
    "class":"table-responsive",
    "html":"Gotcha!"
}

Может быть несколько объектов с класс "реагирующий на таблицу", поэтому, если их несколько:

[
    {
        "class":"table-responsive",
        "html":"Gotcha!"
    },
    {
        "class":"table-responsive",
        "html":"Gotcha!"
    }
]

Я пытался выполнить sh функцию, которая проходит через все элементы и проверяет, где равен ключ класса " «реагирующий на таблицу», если это так, pu sh объект в массив. (array_push($result, $obj);) Если текущий элемент является массивом, через него тоже l oop. Там может быть много измерений, поэтому в идеале функция вызывает себя. (Рекурсивный)

1 Ответ

1 голос
/ 01 мая 2020

То, что вам нужно, это рекурсивная уменьшение операция. Что-то, что может

  1. Итерировать ваши элементы
  2. Захватывать все с соответствующим свойством и
  3. Выполнить ту же операцию на любом children
// decode your JSON into an associative array
$data = json_decode($json, true);

// setup search parameters
$findKey = 'class';
$findValue = 'table-responsive';

// create a recursive reducer
$reducer = function($carry, $item) use (&$reducer, $findKey, $findValue) {
    if (array_key_exists($findKey, $item) && $item[$findKey] === $findValue) {
        // if this $item matches, add it to the $carry array
        $carry[] = $item;
    }
    if (!empty($item['children'])) {
        // this $item has children so dive deeper
        return array_reduce($item['children'], $reducer, $carry);
    }
    // no children in this one so on to the next iteration
    return $carry;
};

// Run the reducer at the top level. 
// Note I've wrapped the root object in an array so the reducer can iterate it
$found = array_reduce([ $data ], $reducer, []);

// and display
echo json_encode($found, JSON_PRETTY_PRINT);

Демо ~ https://3v4l.org/6mWmC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...