按 parent_id、parent_id~>page_id 对 stdClass 排序,然后 page_order
Sort stdClass by parent_id, parent_id~>page_id, then page_order
我正在尝试对提供给我的导航菜单列表进行排序(作为数组中的 $response)。因此,它将是 parent_id(null 是顶层导航。)然后子页面将落在父 ID 下,父 ID 将是 page_id,然后在 page_order 中。基本上按照您看到导航的顺序。网站上的菜单。
例如:
First Nav
--First Nav Sub Page 1
--First Nav Sub Page 2
--First Nav Sub Page 3
--First Nav Sub Page 4
--First Nav Sub Page 5
Second Nav
Third Nav
--Third Nav Sub Page 1
--Third Nav Sub Page 2
Fourth Nav
数组:
Array (
[0] => stdClass Object
(
[page_id] => 122021
[title] => First Nav
[page_order] => 1
[parent_id] => null
)
[1] => stdClass Object
(
[page_id] => 99122
[title] => Second Nav
[page_order] => 2
[parent_id] => null
)
[2] => stdClass Object
(
[page_id] => 260447
[title] => Third Nav
[page_order] => 3
[parent_id] => null
)
[3] => stdClass Object
(
[page_id] => 170627
[title] => Fourth Nav
[page_order] => 4
[parent_id] => null
)
[4] => stdClass Object
(
[page_id] => 134788
[title] => Third Nav Sub Page 1
[page_order] => 1
[parent_id] => 260447
)
[5] => stdClass Object
(
[page_id] => 157074
[title] => Third Nav Sub Page 2
[page_order] => 2
[parent_id] => 260447
)
[6] => stdClass Object
(
[page_id] => 699423
[title] => First Nav Sub Page 1
[page_order] => 1
[parent_id] => 122021
)
[7] => stdClass Object
(
[page_id] => 346209
[title] => First Nav Sub Page 2
[page_order] => 2
[parent_id] => 122021
)
[8] => stdClass Object
(
[page_id] => 732773
[title] => First Nav Sub Page 3
[page_order] => 3
[parent_id] => 122021
)
[9] => stdClass Object
(
[page_id] => 164338
[title] => First Nav Sub Page 4
[page_order] => 4
[parent_id] => 122021
)
[10] => stdClass Object
(
[page_id] => 671117
[title] => First Nav Sub Page 5
[page_order] => 5
[parent_id] => 122021
)
)
我已经设法通过 parent_id 然后 page_order(如上面的数组所示)使用下面提到的 ArrSort 函数以部分顺序获得它,但我无法将子页面 page_order 'underneath' 放入它们的 parent_id。
我试过:
function ArrSort ($Array){
$parent_id = array();
$page_order = array();
foreach($Array as $key => $value){
$parent_id[] = $value->parent_id;
$page_order[] = $value->page_order;
}
array_multisort($parent_id, SORT_ASC, $page_order, SORT_ASC, $Array);
return $Array;
}
$sorted_pages_array = ArrSort($response);
我也试过以下,
function PageList($a, $b){
if ( $a->page_id == $b->page_id ) {
return 0;
} else if ( $a->parent_id ) {
if ( $a->parent_id == $b->parent_id ) {
return ( $a->page_id < $b->page_id ? -1 : 1 );
} else {
return ( $a->parent_id >= $b->page_id ? 1 : -1 );
}
} else if ( $b->parent_id ) {
return ( $b->parent_id >= $a->page_id ? -1 : 1);
} else {
return ( $a->page_id < $b->page_id ? -1 : 1 );
}
}
usort($response, "PageList");
以及两者的结合:
$sorted_pages_array = ArrSort($response);
usort($sorted_pages_array, "PageList");
不幸的是,我对数组和排序不是很熟悉,需要一些帮助。
试试这个:
usort($sorted_pages_array, function($a, $b){
if($a->parent_id === $b->parent_id && $a->page_id === $b->page_id){
return $a->page_order - $b->page_order;
}
elseif($a->parent_id === $b->parent_id){
return $a->page_id - $b->page_id;
} else {
return $a->parent_id - $b->parent_id;
}
});
首先在数据库中对数据进行排序可能会更容易。
经过一些挖掘,我发现了这个:
因此,除了更改以下内容外,从上面链接的解决方案:
$node['object']->id
到 $node['object']->page_id
$node['object']->top_id
到 $node['object']->parent_id
$node['object']->name
到 $node['object']->title
(并添加了一些我自己的更新),这就是我一直在寻找的。当我在函数 ArrSort 之后添加它时(在我原来的问题中),一切都很好!
我正在尝试对提供给我的导航菜单列表进行排序(作为数组中的 $response)。因此,它将是 parent_id(null 是顶层导航。)然后子页面将落在父 ID 下,父 ID 将是 page_id,然后在 page_order 中。基本上按照您看到导航的顺序。网站上的菜单。
例如:
First Nav
--First Nav Sub Page 1
--First Nav Sub Page 2
--First Nav Sub Page 3
--First Nav Sub Page 4
--First Nav Sub Page 5
Second Nav
Third Nav
--Third Nav Sub Page 1
--Third Nav Sub Page 2
Fourth Nav
数组:
Array (
[0] => stdClass Object
(
[page_id] => 122021
[title] => First Nav
[page_order] => 1
[parent_id] => null
)
[1] => stdClass Object
(
[page_id] => 99122
[title] => Second Nav
[page_order] => 2
[parent_id] => null
)
[2] => stdClass Object
(
[page_id] => 260447
[title] => Third Nav
[page_order] => 3
[parent_id] => null
)
[3] => stdClass Object
(
[page_id] => 170627
[title] => Fourth Nav
[page_order] => 4
[parent_id] => null
)
[4] => stdClass Object
(
[page_id] => 134788
[title] => Third Nav Sub Page 1
[page_order] => 1
[parent_id] => 260447
)
[5] => stdClass Object
(
[page_id] => 157074
[title] => Third Nav Sub Page 2
[page_order] => 2
[parent_id] => 260447
)
[6] => stdClass Object
(
[page_id] => 699423
[title] => First Nav Sub Page 1
[page_order] => 1
[parent_id] => 122021
)
[7] => stdClass Object
(
[page_id] => 346209
[title] => First Nav Sub Page 2
[page_order] => 2
[parent_id] => 122021
)
[8] => stdClass Object
(
[page_id] => 732773
[title] => First Nav Sub Page 3
[page_order] => 3
[parent_id] => 122021
)
[9] => stdClass Object
(
[page_id] => 164338
[title] => First Nav Sub Page 4
[page_order] => 4
[parent_id] => 122021
)
[10] => stdClass Object
(
[page_id] => 671117
[title] => First Nav Sub Page 5
[page_order] => 5
[parent_id] => 122021
)
)
我已经设法通过 parent_id 然后 page_order(如上面的数组所示)使用下面提到的 ArrSort 函数以部分顺序获得它,但我无法将子页面 page_order 'underneath' 放入它们的 parent_id。
我试过:
function ArrSort ($Array){
$parent_id = array();
$page_order = array();
foreach($Array as $key => $value){
$parent_id[] = $value->parent_id;
$page_order[] = $value->page_order;
}
array_multisort($parent_id, SORT_ASC, $page_order, SORT_ASC, $Array);
return $Array;
}
$sorted_pages_array = ArrSort($response);
我也试过以下,
function PageList($a, $b){
if ( $a->page_id == $b->page_id ) {
return 0;
} else if ( $a->parent_id ) {
if ( $a->parent_id == $b->parent_id ) {
return ( $a->page_id < $b->page_id ? -1 : 1 );
} else {
return ( $a->parent_id >= $b->page_id ? 1 : -1 );
}
} else if ( $b->parent_id ) {
return ( $b->parent_id >= $a->page_id ? -1 : 1);
} else {
return ( $a->page_id < $b->page_id ? -1 : 1 );
}
}
usort($response, "PageList");
以及两者的结合:
$sorted_pages_array = ArrSort($response);
usort($sorted_pages_array, "PageList");
不幸的是,我对数组和排序不是很熟悉,需要一些帮助。
试试这个:
usort($sorted_pages_array, function($a, $b){
if($a->parent_id === $b->parent_id && $a->page_id === $b->page_id){
return $a->page_order - $b->page_order;
}
elseif($a->parent_id === $b->parent_id){
return $a->page_id - $b->page_id;
} else {
return $a->parent_id - $b->parent_id;
}
});
首先在数据库中对数据进行排序可能会更容易。
经过一些挖掘,我发现了这个:
因此,除了更改以下内容外,从上面链接的解决方案:
$node['object']->id
到 $node['object']->page_id
$node['object']->top_id
到 $node['object']->parent_id
$node['object']->name
到 $node['object']->title
(并添加了一些我自己的更新),这就是我一直在寻找的。当我在函数 ArrSort 之后添加它时(在我原来的问题中),一切都很好!