WordPress.org

Make WordPress Core

Ticket #10852: new_get_page_children.php

File new_get_page_children.php, 2.3 KB (added by santagada, 5 years ago)

another version of the patch, not using recursion

Line 
1<?php
2
3class FakePost {
4        public function __construct($ID, $post_parent) {
5                $this->ID = $ID;
6                $this->post_parent = $post_parent;
7        }
8}
9
10
11function get_page_children( $page_id, $pages ) {
12        $post_hash = array();
13        $children_hash = array();
14
15        // build a hash of ID -> children
16        foreach ( (array) $pages as $page ) {
17                $post_hash[$page->ID] = $page;
18                if ( !array_key_exists( $page->post_parent, $children_hash ) ) {
19                        $children_hash[$page->post_parent] = [$page->ID];
20                } else {
21                        $children_hash[$page->post_parent][] = $page->ID;
22                }
23        }
24
25        if( array_key_exists( $page_id, $children_hash ) ) {
26                $post_list = array();
27                $to_look = array_reverse( $children_hash[$page_id] );
28                // while we still have posts to_look add them to the list
29                while ( $to_look ) {
30                        $id = array_pop( $to_look );
31                        $post_list[] = $post_hash[$id];
32                        if ( array_key_exists( $id, $children_hash ) ) {
33                                foreach( array_reverse( $children_hash[$id] ) as $child ) {
34                                        $to_look[] = $child;
35                                }
36                        }
37                }
38                return $post_list;
39        } else {
40                return array();
41        }
42}
43
44function old_get_page_children($page_id, $pages) {
45        $page_list = array();
46        foreach ( (array) $pages as $page ) {
47                if ( $page->post_parent == $page_id ) {
48                        $page_list[] = $page;
49                        if ( $children = old_get_page_children($page->ID, $pages) ) {
50                                $page_list = array_merge($page_list, $children);
51                        }
52                }
53        }
54        return $page_list;
55}
56
57function tests() {
58        $pages = [];
59        $pages[] = new FakePost(1, 0);
60        $pages[] = new FakePost(2, 0);
61        $pages[] = new FakePost(3, 2);
62        $pages[] = new FakePost(4, 2);
63        $pages[] = new FakePost(5, 0);
64        for ($i=6; $i < 1000; $i++) {
65                $pages[] = new FakePost($i, rand(0, $i-1));
66        }
67        $max_depth = 50;
68        for ($i=1000; $i < (1000 + $max_depth); $i++) {
69                $pages[] = new FakePost($i, $i-1);
70        }
71        for ($i=(1000 + $max_depth); $i < 2000; $i++) {
72                $pages[] = new FakePost($i, 5);
73        }
74        for ($i=2000; $i < 4000; $i++) {
75                $pages[] = new FakePost($i, 1);
76        }
77
78        for ($i=0; $i < 8; $i++) {
79                $time = [];
80                $r = [];
81
82                $time_start = microtime(true);
83                $r[] = get_page_children($i, $pages);
84                $time[] = (int) ((microtime(true) - $time_start) * 1000);
85
86                $time_start = microtime(true);
87                $r[] = old_get_page_children($i, $pages);
88                $time[] = (int) ((microtime(true) - $time_start) * 1000);
89
90                echo ($r[0] == $r[1])?'Equal':'Different';
91                echo " $time[0] ms (new), $time[1] ms (old)\n";
92        }
93}
94
95tests();