Обработка на parents/childs

Ticketa

Registered
Привет, някой може ли да ми помогне възможно най-кратко да обработя следния масив и да изглежда с възможно най-малко код:

(метода/функцията getTree на този етап не ми се иска да пипам, а единствено изходния return)

Parent
-- Child
-- Child
Parent
Parent
Parent
PHP:
    /**
     *
     * Select All Categories
     *
     * Using $child
     *
     */
    public static function getTree($child = null)
    {
        $db = static::getDB();

        if ($child)
            $where = '`posts_category`.`category_parent_id` = ' . $child;
        else
            $where = '`posts_category`.`category_parent_id` = 0 ';

        $sth = $db->prepare("SELECT *
        FROM
            `posts_category`
        LEFT JOIN `posts_category_translate` ON
            `posts_category`.`category_id` = `posts_category_translate`.`category_id`
            WHERE " . $where . " ORDER BY `posts_category`.`category_id` DESC;
");

        $sth->execute();
 
        if ($child) {
            $result = $sth->fetchAll();
            $return = $result;
        } else { //get parents
            while ($result = $sth->fetch())
            {
                //one by one
                $return[] = array(  'parent' => $result, //parent info
                                    'childs' => static::getTree($result['category_id']) //childs
                                );
            }
        }
 
        return $return;
    }


Тук в контролера ги извеждам със следната опция:
print_r(\App\Models\Post::getTree());
Код:
Array
(
    [0] => Array
        (
            [parent] => Array
                (
                    [category_id] => 7
                    [0] => 7
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 7
                    [3] => 7
                    [category_lang] => en
                    [4] => en
                    [5] => 7
                    [category_slug] => parent-10
                    [6] => parent-10
                    [category_name] => Parent 10
                    [7] => Parent 10
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                    [0] => Array
                        (
                            [category_id] => 9
                            [0] => 9
                            [category_parent_id] => 7
                            [1] => 7
                            [category_icon] =>
                            [2] =>
                            [category_translate_id] => 9
                            [3] => 9
                            [category_lang] => en
                            [4] => en
                            [5] => 9
                            [category_slug] => parent-9
                            [6] => parent-9
                            [category_name] => Parent 9
                            [7] => Parent 9
                            [category_description] =>
                            [8] =>
                        )
                    [1] => Array
                        (
                            [category_id] => 8
                            [0] => 8
                            [category_parent_id] => 7
                            [1] => 7
                            [category_icon] =>
                            [2] =>
                            [category_translate_id] => 8
                            [3] => 8
                            [category_lang] => en
                            [4] => en
                            [5] => 8
                            [category_slug] => parent-8
                            [6] => parent-8
                            [category_name] => parent 8
                            [7] => Parent 8
                            [category_description] =>
                            [8] =>
                        )
                )
        )
    [1] => Array
        (
            [parent] => Array
                (
                    [category_id] => 6
                    [0] => 6
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 6
                    [3] => 6
                    [category_lang] => en
                    [4] => en
                    [5] => 6
                    [category_slug] => parent-6
                    [6] => parent-6
                    [category_name] => Parent 6
                    [7] => Parent 6
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [2] => Array
        (
            [parent] => Array
                (
                    [category_id] => 5
                    [0] => 5
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 5
                    [3] => 5
                    [category_lang] => en
                    [4] => en
                    [5] => 5
                    [category_slug] => parent-5
                    [6] => Parent 5
                    [category_name] => parent-5
                    [7] => Parent 5
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [3] => Array
        (
            [parent] => Array
                (
                    [category_id] => 4
                    [0] => 4
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 4
                    [3] => 4
                    [category_lang] => en
                    [4] => en
                    [5] => 4
                    [category_slug] => parent-4
                    [6] => parent-4
                    [category_name] => Parent 4
                    [7] => Parent 4
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [4] => Array
        (
            [parent] => Array
                (
                    [category_id] => 3
                    [0] => 3
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 3
                    [3] => 3
                    [category_lang] => en
                    [4] => en
                    [5] => 3
                    [category_slug] => parent-3
                    [6] => Parent 3
                    [category_name] => parent-3
                    [7] => Parent 3
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [5] => Array
        (
            [parent] => Array
                (
                    [category_id] => 2
                    [0] => 2
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 2
                    [3] => 2
                    [category_lang] => en
                    [4] => en
                    [5] => 2
                    [category_slug] => parent-2
                    [6] => parent-2
                    [category_name] => Parent 2
                    [7] => Parent 2
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [6] => Array
        (
            [parent] => Array
                (
                    [category_id] => 1
                    [0] => 1
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 1
                    [3] => 1
                    [category_lang] => en
                    [4] => en
                    [5] => 1
                    [category_slug] => others
                    [6] => others
                    [category_name] => Others
                    [7] => Others
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
)



ЕДИТ: Включих хахахаха

Код:
foreach (\App\Models\Post::getTree() as $category) {
            // Print out information about the parent category
            echo "Parent Category ID: " . $category['parent']['category_id'] . "\n";
            echo "Parent Category Name: " . $category['parent']['category_name'] . "\n";
        
            // Print out information about the child categories
            foreach ($category['childs'] as $child) {
                echo "Child Category ID: " . $child['category_id'] . "\n";
                echo "Child Category Name: " . $child['category_name'] . "\n";
            }
        }
 
Последно редактирано:
Привет, някой може ли да ми помогне възможно най-кратко да обработя следния масив и да изглежда с възможно най-малко код:

(метода/функцията getTree на този етап не ми се иска да пипам, а единствено изходния return)


PHP:
    /**
     *
     * Select All Categories
     *
     * Using $child
     *
     */
    public static function getTree($child = null)
    {
        $db = static::getDB();

        if ($child)
            $where = '`posts_category`.`category_parent_id` = ' . $child;
        else
            $where = '`posts_category`.`category_parent_id` = 0 ';

        $sth = $db->prepare("SELECT *
        FROM
            `posts_category`
        LEFT JOIN `posts_category_translate` ON
            `posts_category`.`category_id` = `posts_category_translate`.`category_id`
            WHERE " . $where . " ORDER BY `posts_category`.`category_id` DESC;
");

        $sth->execute();
 
        if ($child) {
            $result = $sth->fetchAll();
            $return = $result;
        } else { //get parents
            while ($result = $sth->fetch())
            {
                //one by one
                $return[] = array(  'parent' => $result, //parent info
                                    'childs' => static::getTree($result['category_id']) //childs
                                );
            }
        }
 
        return $return;
    }


Тук в контролера ги извеждам със следната опция:
print_r(\App\Models\Post::getTree());
Код:
Array
(
    [0] => Array
        (
            [parent] => Array
                (
                    [category_id] => 7
                    [0] => 7
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 7
                    [3] => 7
                    [category_lang] => en
                    [4] => en
                    [5] => 7
                    [category_slug] => parent-10
                    [6] => parent-10
                    [category_name] => Parent 10
                    [7] => Parent 10
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                    [0] => Array
                        (
                            [category_id] => 9
                            [0] => 9
                            [category_parent_id] => 7
                            [1] => 7
                            [category_icon] =>
                            [2] =>
                            [category_translate_id] => 9
                            [3] => 9
                            [category_lang] => en
                            [4] => en
                            [5] => 9
                            [category_slug] => parent-9
                            [6] => parent-9
                            [category_name] => Parent 9
                            [7] => Parent 9
                            [category_description] =>
                            [8] =>
                        )
                    [1] => Array
                        (
                            [category_id] => 8
                            [0] => 8
                            [category_parent_id] => 7
                            [1] => 7
                            [category_icon] =>
                            [2] =>
                            [category_translate_id] => 8
                            [3] => 8
                            [category_lang] => en
                            [4] => en
                            [5] => 8
                            [category_slug] => parent-8
                            [6] => parent-8
                            [category_name] => parent 8
                            [7] => Parent 8
                            [category_description] =>
                            [8] =>
                        )
                )
        )
    [1] => Array
        (
            [parent] => Array
                (
                    [category_id] => 6
                    [0] => 6
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 6
                    [3] => 6
                    [category_lang] => en
                    [4] => en
                    [5] => 6
                    [category_slug] => parent-6
                    [6] => parent-6
                    [category_name] => Parent 6
                    [7] => Parent 6
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [2] => Array
        (
            [parent] => Array
                (
                    [category_id] => 5
                    [0] => 5
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 5
                    [3] => 5
                    [category_lang] => en
                    [4] => en
                    [5] => 5
                    [category_slug] => parent-5
                    [6] => Parent 5
                    [category_name] => parent-5
                    [7] => Parent 5
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [3] => Array
        (
            [parent] => Array
                (
                    [category_id] => 4
                    [0] => 4
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 4
                    [3] => 4
                    [category_lang] => en
                    [4] => en
                    [5] => 4
                    [category_slug] => parent-4
                    [6] => parent-4
                    [category_name] => Parent 4
                    [7] => Parent 4
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [4] => Array
        (
            [parent] => Array
                (
                    [category_id] => 3
                    [0] => 3
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 3
                    [3] => 3
                    [category_lang] => en
                    [4] => en
                    [5] => 3
                    [category_slug] => parent-3
                    [6] => Parent 3
                    [category_name] => parent-3
                    [7] => Parent 3
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [5] => Array
        (
            [parent] => Array
                (
                    [category_id] => 2
                    [0] => 2
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 2
                    [3] => 2
                    [category_lang] => en
                    [4] => en
                    [5] => 2
                    [category_slug] => parent-2
                    [6] => parent-2
                    [category_name] => Parent 2
                    [7] => Parent 2
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
    [6] => Array
        (
            [parent] => Array
                (
                    [category_id] => 1
                    [0] => 1
                    [category_parent_id] => 0
                    [1] => 0
                    [category_icon] =>
                    [2] =>
                    [category_translate_id] => 1
                    [3] => 1
                    [category_lang] => en
                    [4] => en
                    [5] => 1
                    [category_slug] => others
                    [6] => others
                    [category_name] => Others
                    [7] => Others
                    [category_description] =>
                    [8] =>
                )
            [childs] => Array
                (
                )
        )
)



ЕДИТ: Включих хахахаха

Код:
foreach (\App\Models\Post::getTree() as $category) {
            // Print out information about the parent category
            echo "Parent Category ID: " . $category['parent']['category_id'] . "\n";
            echo "Parent Category Name: " . $category['parent']['category_name'] . "\n";
       
            // Print out information about the child categories
            foreach ($category['childs'] as $child) {
                echo "Child Category ID: " . $child['category_id'] . "\n";
                echo "Child Category Name: " . $child['category_name'] . "\n";
            }
        }
Ще почна бате да ти засичам след колко време след пускане на темата пишеш решението. :)

Дори мисля, че в един момент само с решението ще се включваш. Респект. ;)
 
Като цяло решението е пълно относно въпроса ми, но ако някой иска може спокойно да го развие от към recursive и някой потребител да го ползва за:
Parent
-- Child
----- Child
----- Child

Лесно е, ако имам време по-късно ще драсна - освен, ако някой не ме изпревари hahahaha
 
Само да вметна, че е хубаво да правиш някакви проверки, защото не е сигурно, че винаги ще има $category['childs'] и ще гърми :)
 
Само да вметна, че е хубаво да правиш някакви проверки, защото не е сигурно, че винаги ще има $category['childs'] и ще гърми :)

PHP-то (като променлива) го плювам в twig темплейт и там го филтрирам с `length` - въпреки, че и аз се замислих дали просто не е по-добре да го чеквам дали е празно с empty ? Как мислиш, кое ще е по-добър вариант?
PHP:
          {% for category in categoryfulllist %}
              <a href="{{ ('/blog/category/' ~ category.parent.category_id ~ '/' ~ category.parent.category_slug) | generalUrl }}" title="{{ category.parent.category_name }}">{{ category.parent.category_name }}</a>
              {% if category.childs|length > 0 %}
                {% for child in category.childs %}
                   
                <a href="{{ ('/blog/category/' ~ child.category_id ~ '/' ~ child.category_slug) | generalUrl }}" title="{{ child.category_name }}">-- {{ child.category_name }}</a>
     
                {% endfor %}
              {% endif %}
          {% endfor %}

{% if not empty(category.childs) %} <<< това смятам, че ми е вторият вариант, но погледнато реално и length проверява за дължината т.е. има ли нещо

By the way, как мога да го тествам да гръмне ?
 
Последно редактирано:
В Twig мисля че не ти трябва въобще if-а, с който проверяваш childs. Ако колекцията подадена на for е празна, то просто няма да завърти цикъла.

Ако ти трябва, за да провериш дали имаш childs, то вариантите са да се подсигуриш, че винаги ще го имаш, дори и празен масив да е, или може да ползваш тогава

PHP:
{% if category.childs is defined %}

макар че бих тествал без проверки и просто директно подаване на вътрешния цикъл. Не се сещам дали Twig гърмеше в такъв случай.

Иначе аз лично бих избрал да си стандартизирам изхода от метода и винаги да получавам един формат. Така няма да се налага да правя излишни проверки, за да нагодя кода по изхода.

За да тестваш да гръмне, просто ръчно си създай един масив и го подай на темплейта.
 

Back
Горе