Vue война: ожидаемый массив, полученный объект - PullRequest
0 голосов
/ 28 февраля 2020

Мне нужно создать этот объект из PHP массива и разобрать его в JSON в Vue объект.

Vue объект:

 options: [
        {
          language: 'Javascript',
          libs: [
            { name: 'Vue.js', category: 'Front-end' },
            { name: 'Adonis', category: 'Backend' }
          ]
        },
        {
          language: 'Ruby',
          libs: [
            { name: 'Rails', category: 'Backend' },
            { name: 'Sinatra', category: 'Backend' }
          ]
        },
        {
          language: 'Other',
          libs: [
            { name: 'Laravel', category: 'Backend' },
            { name: 'Phoenix', category: 'Backend' }
          ]
        }
      ]

Например, в php у меня есть следующий массив:

$testArray = [
13 => [
    'language' => 'languageTest',
    'libs' => [30 => ['name' => 'nameTest', 'id' => '30'],
               31 => ['name' => 'nameTest', 'id' => '31'],
               32 => ['name' => 'nameTest', 'id' => '32'],
    ]
],
14 => [
    'language' => 'languageTest',
    'libs' => [30 => ['name' => 'nameTest', 'id' => '30'],
               31 => ['name' => 'nameTest', 'id' => '31'],
               32 => ['name' => 'nameTest', 'id' => '32'],
    ]
]
];

Если я передам это "json", я получу следующий результат.

{"13":{"language":"languageTest","libs":{"30":{"name":"nameTest","id":"30"},"31":{"name":"nameTest","id":"31"},"32":{"name":"nameTest","id":"32"}}},"14":{"language":"languageTest","libs":{"30":{"name":"nameTest","id":"30"},"31":{"name":"nameTest","id":"31"},"32":{"name":"nameTest","id":"32"}}}}

Это дает мне следующую ошибку в Vue компонент: https://vue-multiselect.js.org/#sub -option-groups

Недопустимый проп: проверка типа завершилась неудачно для опций пропа. Ожидаемый массив, есть объект.

Как создать массив из PHP, но при передаче в JSON это правильно для компонента Vue?

ОБНОВЛЕНИЕ: Я рекурсивно создаю этот массив, присваивая значения.

private function getChildCategoryTree($category, $level = 1, $maxLevel = 2)
{
    $arrayTreeCategory = [];
    if ($category->hasChildren()) {
        $childCategories = $this->getSubcategories($category);
        if (count($childCategories) > 0) {
            foreach ($childCategories as $childCategory) {
                if ($childCategory->hasChildren() && $level < $maxLevel && $childCategory->getId() != 14) {
                    if ($this->categoryCanShow($childCategory)) {
                        $subLevel = $level + 1;
                        $arrayTreeCategory[$childCategory->getId()]['language'] = $childCategory->getName();
                        $arrayTreeCategory[$childCategory->getId()]['libs'] = $this->getChildCategoryTree($childCategory, $subLevel);
                    }
                } else {
                    if ($this->categoryCanShow($childCategory)) {
                        if ($level == 1) {
                            $arrayTreeCategory[99]['language'] = 'other';
                            $arrayTreeCategory[99]['libs'] = ['name' => $childCategory->getName(), 'id' => $childCategory->getId()];
                        } else {
                            $arrayTreeCategory[$childCategory->getId()] = ['name' => $childCategory->getName(), 'id' => $childCategory->getId()];
                        }
                    }
                }
            }
        }
    }

    return $arrayTreeCategory;
}

1 Ответ

1 голос
/ 28 февраля 2020

Массив, который вы передаете, преобразуется в объект в JS (поскольку вы используете ассоциативный массив в PHP).

Если вам не нужны ключи (13 и 14 соответственно) , просто удалите ключи, например, так:

$testArray = [
    [
        'language' => 'languageTest',
        'libs' => [30 => ['name' => 'nameTest', 'id' => '30'],
            31 => ['name' => 'nameTest', 'id' => '31'],
            32 => ['name' => 'nameTest', 'id' => '32'],
        ]
    ],
    [
        'language' => 'languageTest',
        'libs' => [30 => ['name' => 'nameTest', 'id' => '30'],
            31 => ['name' => 'nameTest', 'id' => '31'],
            32 => ['name' => 'nameTest', 'id' => '32'],
        ]
    ]
];

Если вам НЕОБХОДИМ идентификатор, у вас есть 2 варианта:

Вариант 1 - переместить идентификатор на внутренний массив, например, так:

$testArray = [
    [
        'id' => 13,
        'language' => 'languageTest',
        'libs' => [30 => ['name' => 'nameTest', 'id' => '30'],
            31 => ['name' => 'nameTest', 'id' => '31'],
            32 => ['name' => 'nameTest', 'id' => '32'],
        ]
    ],
    [
        'id' => 14,
        'language' => 'languageTest',
        'libs' => [30 => ['name' => 'nameTest', 'id' => '30'],
            31 => ['name' => 'nameTest', 'id' => '31'],
            32 => ['name' => 'nameTest', 'id' => '32'],
        ]
    ]
];

Вариант 2: Измените тип реквизита на Object и убедитесь, что вы применили некоторые корректировки в своем коде, чтобы он работал так, как вы сначала запланировали и спроектировали.

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