@KirillSPB777

Как исправить json плагина REST для терминов таксономии?

приветствую! я не имею опыта в PHP, и прошу помощи, на просторах нашел пример кода Но он немного не правильно выводит дерево
{
  "11": {
    "14": {
      "tid": "14",
      "name": "child-1",
      "weight": "0"
    },
    "19": {
      "tid": "19",
      "name": "child-2",
      "weight": "1"
    },
    "tid": "11",
    "name": "parent-1",
    "weight": "7"
  },
  "12": {
    "17": {
      "tid": "17",
      "name": "child-1",
      "weight": "0"
    },
    "18": {
      "tid": "18",
      "name": "child-2",
      "weight": "1"
    },
    "tid": "12",
    "name": "parent-2",
    "weight": "6"
  }
 }

код плагина rest resource
$vid = 'digest';
    $terms =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, 0, 1);
    $termDataAll = [];
    foreach ($terms as $term) {
      $termDataAll[$term->tid]["tid"] = $term->tid;
      $termDataAll[$term->tid]["name"] = $term->name;
      $termDataAll[$term->tid]["weight"] = $term->weight;
      $childs =\Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term->tid, 1);
      foreach($childs as $child) {
        $termDataAll[$term->tid][$child->tid]["tid"] = $child->tid;
        $termDataAll[$term->tid][$child->tid]["name"] = $child->name;
        $termDataAll[$term->tid][$child->tid]["weight"] = $child->weight;
      }
    }


я не врубаюсь откуда в начале каждого блока эти tidы "11": {... ? как их убрать? и почему лист $termDataAll = []; но на выводе это данные {...}?
навыки и логика python не помогает понять этот php)
  • Вопрос задан
  • 38 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Всё элементарно. В PHP любой массив - ассоциативный, что соответствует объекту JSON.
Но, если индекс массива начинается с нуля и содержит только строго последовательные номера (0, 1, 2, 3 и т.д.), то для простоты он представляется как классический массив, в том числе и в JSON.
print json_encode(['a', 'b']); // ["a","b"]
print json_encode([0 => 'a', 1 => 'b']); // ["a","b"]
print json_encode([1 => 'a', 2 => 'b']); // {"1":"a","2":"b"}
У вас массив заполняется по индексам $term->tid, которые не образуют классической последовательности, поэтому и представляются объектом.
Ваш код можно переписать так:
$vid = 'digest';
$termDataAll = array_map(
    fn($term) => [
        'tid' => $term->tid,
        'name' => $term->name,
        'weight' => $term->weight,
        'childs' => array_map(
            fn($child) => [
                'tid' => $child->tid,
                'name' => $child->name,
                'weight' => $child->weight
            ],
            \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, $term->tid, 1)
        )
    ],
    \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree($vid, 0, 1)
);

В результате должен получиться такой JSON
[
  [
    "tid": "11",
    "name": "parent-1",
    "weight": "7",
    "childs": [
      ["tid": "14", "name": "child-1", "weight": "0"],
      ["tid": "19", "name": "child-2", "weight": "1"],
    ],
  ], [
    "tid": "12",
    "name": "parent-2",
    "weight": "6",
    "childs": [
      ["tid": "17", "name": "child-1", "weight": "0"],
      ["tid": "18", "name": "child-2", "weight": "1"]
    ]
  ]
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы