У меня есть SQL-запрос, который возвращает:
Array
(
[0] => stdClass Object
(
[id] => 1
[parent] =>
[created_at] => 2015
[updated_at] => 0
[name] => Strona Główna
[short] =>
[content] =>
[header] =>
[img] =>
[visible] => 0
[position] => 1000
[top] => 0
[left] => 0
[footer] => 0
[dropdown] => 0
[chilldren] => 0
[title] =>
[description] =>
[keywords] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
[1] => stdClass Object
(
[id] => 2
[родитель] => 1
[creation_at] => 2015
[updated_at] => 0
[имя] => Подстрона строны главней
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
[2] => stdClass Object
(
[id] => 3
[родитель] =>
[creation_at] => 2015
[updated_at] => 2015
[имя] => О нас
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
[3] => stdClass Object
(
[id] => 5
[родитель] => 1
[creation_at] => 2015
[updated_at] => 2015
[имя] => Колейна подстрона
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
[4] => stdClass Object
(
[id] => 6
[родитель] => 3
[creation_at] => 2015
[updated_at] => 0
[имя] => Колейна подстрона
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
[5] => stdClass Object
(
[id] => 8
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => tuytuytuyt
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
[6] => stdClass Object
(
[id] => 9
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => fghfhgfh
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
)
)
[/ NOEDIT]
И я почти успешно сделал это, чтобы отсортировать. Если элемент имеет родителя, он создает массив и помещает потомков в этот элемент, но есть проблема с последними элементами, и я не знаю, почему.
Теперь вывод выглядит так:
Array
(
[0] => stdClass Object
(
[id] => 1
[parent] =>
[created_at] => 2015
[updated_at] => 0
[name] => Strona Główna
[short] =>
[content] =>
[header] =>
[img] =>
[visible] => 0
[position] => 1000
[top] => 0
[left] => 0
[footer] => 0
[dropdown] => 0
[chilldren] => 0
[title] =>
[description] =>
[keywords] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
[0] => stdClass Object
(
[id] => 2
[родитель] => 1
[creation_at] => 2015
[updated_at] => 0
[имя] => Подстрона строны главней
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
[1] => stdClass Object
(
[id] => 5
[родитель] => 1
[creation_at] => 2015
[updated_at] => 2015
[имя] => Колейна подстрона
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
[0] => stdClass Object
(
[id] => 8
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => tuytuytuyt
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
[1] => stdClass Object
(
[id] => 9
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => fghfhgfh
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
)
)
)
)
[1] => stdClass Object
(
[id] => 2
[родитель] => 1
[creation_at] => 2015
[updated_at] => 0
[имя] => Подстрона строны главней
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
[2] => stdClass Object
(
[id] => 3
[родитель] =>
[creation_at] => 2015
[updated_at] => 2015
[имя] => О нас
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
[0] => stdClass Object
(
[id] => 6
[родитель] => 3
[creation_at] => 2015
[updated_at] => 0
[имя] => Колейна подстрона
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
)
)
[3] => stdClass Object
(
[id] => 5
[родитель] => 1
[creation_at] => 2015
[updated_at] => 2015
[имя] => Колейна подстрона
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
[0] => stdClass Object
(
[id] => 8
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => tuytuytuyt
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
[1] => stdClass Object
(
[id] => 9
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => fghfhgfh
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
)
)
[4] => stdClass Object
(
[id] => 6
[родитель] => 3
[creation_at] => 2015
[updated_at] => 0
[имя] => Колейна подстрона
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
[5] => stdClass Object
(
[id] => 8
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => tuytuytuyt
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
[6] => stdClass Object
(
[id] => 9
[родитель] => 5
[creation_at] => 2015
[updated_at] => 0
[имя] => fghfhgfh
[короткий] =>
[содержание] =>
[header] =>
[img] =>
[видимый] => 0
[позиция] => 1000
[top] => 0
[слева] => 0
[нижний колонтитул] => 0
[выпадающий] => 0
[chilldren] => 0
[title] =>
[описание] =>
[ключевые слова] =>
arraysparentphpsorting знак равно>
[redirect] =>
[js] =>
[css] =>
[css_class] =>
[модуль] =>
[lang] => 0
[узел] => массив
(
)
)
)
[/ NOEDIT]
Как видите, последние элементы не фильтруются.
Код для «сортировки» родительского кода выглядит так:
$new = [];
foreach($data as $key => $item) {
$data[$key] - > node = [];
array_push($new, $data[$key]);
for ($i = 0; $i < count($new); $i++) {
if ($new[$i] - > id == $data[$key] - > parent) {
array_push($new[$i] - > node, $data[$key]);
}
}
}
print_r($data);
Может кто-нибудь объяснить мне, что я делаю не так?
Вы можете использовать рекурсивную функцию, например так:
function makeTree($data, $parent) {
$tree = [];
foreach($data as $item) {
if ($item -> parent == $parent) {
$item -> node = makeTree($data, $item -> id);
$tree[] = $item;
}
}
return $tree;
}
$new = makeTree($data, null);
print_r($new);
Эта функция создает дерево всех потомков данного родителя. Рекурсия останавливается, когда элемент не имеет дочерних элементов, а затем функция возвращает пустой массив.
Возвращаемое значение функции (массив) используется вызывающей стороной, чтобы добавить его к node
свойство родительского узла.
Сначала функция вызывается корневым значением, т.е. значением, которое вы назначаете parent
свойство, когда нет родителя. В вашем случае это null
так вот почему основной звонок имеет null
в качестве второго аргумента.
Когда вы перебираете результаты, вы должны спросить, есть ли у текущего элемента родительский элемент. Если у элемента нет родителя, просто добавьте элемент в новый массив, но если у элемента есть родитель, добавьте его в список узлов этого элемента:
$new = [];
foreach($data as $key => $item) {
if(!empty($item->parent))
$new[$item->id]->node[]= $item;
else
$new[$item->id]= $item;
}
print_r($data);
Конечно, это будет работать только в том случае, если родительский элемент предшествует этому элементу в наборе результатов.