WordPress Version: 4.3
/**
* Order the pages with children under parents in a flat list.
*
* It uses auxiliary structure to hold parent-children relationships and
* runs in O(N) complexity
*
* @since 2.0.0
*
* @param array $pages Posts array, passed by reference.
* @param int $page_id Optional. Parent page ID. Default 0.
* @return array A list arranged by hierarchy. Children immediately follow their parents.
*/
function get_page_hierarchy(&$pages, $page_id = 0)
{
if (empty($pages)) {
return array();
}
$children = array();
foreach ((array) $pages as $p) {
$parent_id = intval($p->post_parent);
$children[$parent_id][] = $p;
}
$result = array();
_page_traverse_name($page_id, $children, $result);
return $result;
}