Symfony / Sonata得到下一个孩子(兄弟姐妹)

时间:2017-10-05 10:53:38

标签: php symfony logic sonata

我正在寻找最简洁的方法来获得一个对象的下一个孩子的兄弟姐妹(父母的下一个孩子)。

-- Parent Object
       -- Child 1
       -- Child 2 (<== Current object)
       -- Child 3 (<== Required object)
       -- Child 4

在这个例子中假设我们正在谈论页面(奏鸣曲页面)。目前我有第2页(孩子2),并且需要同一父母的下一页(在这种情况下是孩子3)。如果我有最后一页(孩子4),那么我需要第一个孩子。

一个选项是请求父级,然后请求所有子级,遍历所有子级并查找当前子级。然后带下一个孩子,或者第一个孩子,以防没有下一个孩子。但这似乎是很多代码,如果逻辑和循环有很多丑陋。所以我想知道是否有某种模式来解决这个问题。

1 个答案:

答案 0 :(得分:0)

最终我想出了下一个解决方案:

/** 
* $siblings is an array containing all pages with the same parent. 
* So it also includes the current page.
* First check if there are siblings: Check if the parent has more then 1 child
**/
if (count($siblings) != 1) {
        // Find the current page in the array
        for ($i = 0; $i < count($siblings); $i++) {

            // If we're not at the end of the array: Return next sibling
            if ($siblings{$i}->getId() === $page->getId() && $i+1 != count($siblings)) {
                return $siblings{$i+1};
            }

            // If we're at the end: Return first sibling
            if ($siblings{$i}->getId() === $page->getId() && $i+1 == count($siblings)) {
                return $siblings{0};
            }
        }
    }

对于解决这个问题,这似乎是一个非常干净的解决方案。我们没有过多的循环,如果是逻辑,但代码仍然可读。