Моя база данных хранит такой список:
ID | name
--- -----
1 | search
2 | search.categories
3 | search.categories.accessories
4 | search.categories.accessories.glasses
5 | search.categories.accessories.hats
6 | filters
7 | filters.payments
8 | filters.payments.creditcard
9 | filters.payments.debitcard
Теперь я хочу ВЫБРАТЬ его в рекурсивном массиве вот так:
[
name, childs[
name, childs[ ... ],
name, childs[ ... ],
name, childs[
name, childs[ ... ],
name, childs[ ... ],
],
],
name, childs[
name, childs[ ... ],
name, childs[ ... ],
name, childs[
name, childs[ ... ],
name, childs[ ... ],
],
]
]
Как лучше всего этого добиться? Напрямую из MySQL или ручную обработку строк?
Я написал пример функции PHP, чтобы сделать что-то подобное, но с данными списка смежности вместо данных перечисления путей, как у вас. В любом случае, это может послужить примером для начала. stackoverflow.com/questions/3261228/…






Если вы работаете с Laravel, вы можете создать вложенный массив, используя array_set и используя в качестве ключа столбец название вашей таблицы, пользуясь тем преимуществом, что вы уже храните в точечной нотации.
Несмотря на то, что вы не раскрываете, какова цель этого и почему вы хотите построить эту структуру таким образом, следует один из возможных подходов.
$structure = [])array_set($structure, $listname, $value)В вашем примере я не вижу, откуда может взяться $value, но я думаю, вы уловите идею.
$structure = [];
foreach($rows as $row)
{
array_set($structure, $row->name, $value);
}
Вам нужно будет использовать php для анализа строк и добавления их в массив. В этом тоже нет встроенной функциональности, придется что-то делать. Есть вопросы о том, как присвоить значение массиву с помощью «точечной записи», например Вот этот, что должно помочь вам начать работу. Кроме того, хранение нескольких значений в одном строковом поле, как это (grandparent.parent.child.etc), обычно считается плохой практикой.