How to convert array of objects containing a value into an array indexed by that value?
I have array structured like this:
Array
(
[0] => stdClass Object
(
[ID] => 277
[post_author] => 1
[post_date] => 2011-09-02 08:34:03
[post_date_gmt] => 2011-09-02 08:34:03
[post_content] => <div class="sol_topcont">
[menu_order] => 103
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[1] => 开发者_高级运维stdClass Object
(
[ID] => 275
[post_author] => 1
[post_date] => 2011-09-02 08:32:36
[post_date_gmt] => 2011-09-02 08:32:36
[post_content] => <div class="sol_topcont1">
[menu_order] => 100
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[2] => stdClass Object
(
[ID] => 280
[post_author] => 1
[post_date] => 2011-09-02 08:35:24
[post_date_gmt] => 2011-09-02 08:35:24
[post_content] => <div class="sol_topcont">
[menu_order] => 102
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[3] => stdClass Object
(
[ID] => 282
[post_author] => 1
[post_date] => 2011-09-02 08:36:31
[post_date_gmt] => 2011-09-02 08:36:31
[post_content] => <div class="sol_topcont">
[menu_order] => 101
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
)
I need to sort this array using the ['menu_order'] key value. How do I convert the above array into one like this:
Array
(
[100] => stdClass Object
(
[ID] => 275
[post_author] => 1
[post_date] => 2011-09-02 08:32:36
[post_date_gmt] => 2011-09-02 08:32:36
[post_content] => <div class="sol_topcont1">
[menu_order] => 100
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[101] => stdClass Object
(
[ID] => 282
[post_author] => 1
[post_date] => 2011-09-02 08:36:31
[post_date_gmt] => 2011-09-02 08:36:31
[post_content] => <div class="sol_topcont">
[menu_order] => 101
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[102] => stdClass Object
(
[ID] => 280
[post_author] => 1
[post_date] => 2011-09-02 08:35:24
[post_date_gmt] => 2011-09-02 08:35:24
[post_content] => <div class="sol_topcont">
[menu_order] => 102
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
[103] => stdClass Object
(
[ID] => 277
[post_author] => 1
[post_date] => 2011-09-02 08:34:03
[post_date_gmt] => 2011-09-02 08:34:03
[post_content] => <div class="sol_topcont">
[menu_order] => 103
[post_type] => page
[post_mime_type] =>
[comment_count] => 0
[filter] => raw
)
)
- create a new empty array.
- traverse your original array in a loop.
- retreive menu_order key for current element in loop.
- store the current element in the new array with menu_order as key.
- after the loop,destroy original array.
Something like :
<?php
$newArray = array();
foreach($oldArray as $element)
{
$menuKey = (string) $element->menu_order;
$newArray[$menuKey] = $element;
}
$oldArray = null;
// $newArray now has required data
?>
}
I got an Answer
foreach($whyapptivo_sub_pages as $pages)
{
$key = $pages->menu_order;
$final[$key] = $pages;
ksort($final);
}
foreach($final as $page)
{
........
}
PHP has a usort
function you can pass a custom comparator into. You will need to make a function that has two arguments (in this instance two of your objects), compare them, and return -1, 0 or 1 depending on the comparison.
http://www.php.net/manual/en/function.usort.php
Example
function cmp($a, $b) {
if ($a->menu_order == $b->menu_order) {
return 0;
}
return ($a->menu_order < $b->menu_order) ? -1 : 1;
}
usort($your_array, 'cmp');
精彩评论