排序对象数组

时间:2012-04-16 20:12:38

标签: php arrays sorting foreach

我已经阅读了一些关于此问题的不同主题(like this one以及关于uasort()的一般文档信息 - 我相信这是我正在寻找的内容),但数组仍然是有点顽固(在我的用例中)。

这就是我所拥有的:

// This sets an array of values to a variable
$collection_rows = get_field('collection_profiles');

这是print_r的{​​{1}}:

$collection_rows

(非常糟糕)

我希望按Array ( [0] => Array ( [collection_profile] => Array ( [0] => stdClass Object ( [ID] => 273 [post_author] => 1 [post_date] => 2012-03-26 07:53:45 [post_date_gmt] => 2012-03-26 13:53:45 [post_content] => [post_title] => Profile 1 [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => profile-1 [to_ping] => [pinged] => [post_modified] => 2012-04-12 08:07:35 [post_modified_gmt] => 2012-04-12 14:07:35 [post_content_filtered] => [post_parent] => 0 [guid] => http://domain.com/?post_type=moulding_profiles&p=273 [menu_order] => 0 [post_type] => moulding_profiles [post_mime_type] => [comment_count] => 0 [ancestors] => Array ( ) [filter] => raw ) ) [collection_profile_note] => 1 ) [1] => Array ( [collection_profile] => Array ( [0] => stdClass Object ( [ID] => 188 [post_author] => 1 [post_date] => 2012-02-17 15:24:24 [post_date_gmt] => 2012-02-17 21:24:24 [post_content] => [post_title] => Test Profile [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => test-profile [to_ping] => [pinged] => [post_modified] => 2012-02-28 14:13:32 [post_modified_gmt] => 2012-02-28 20:13:32 [post_content_filtered] => [post_parent] => 0 [guid] => http://domain.com/?post_type=moulding_profiles&p=188 [menu_order] => 0 [post_type] => moulding_profiles [post_mime_type] => [comment_count] => 0 [ancestors] => Array ( ) [filter] => raw ) ) [collection_profile_note] => 3 ) [2] => Array ( [collection_profile] => Array ( [0] => stdClass Object ( [ID] => 207 [post_author] => 1 [post_date] => 2012-02-23 13:35:55 [post_date_gmt] => 2012-02-23 19:35:55 [post_content] => [post_title] => Casing Test Profile [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => casing-test-profile [to_ping] => [pinged] => [post_modified] => 2012-02-23 13:35:55 [post_modified_gmt] => 2012-02-23 19:35:55 [post_content_filtered] => [post_parent] => 0 [guid] => http://domain.com/?post_type=moulding_profiles&p=207 [menu_order] => 0 [post_type] => moulding_profiles [post_mime_type] => [comment_count] => 0 [ancestors] => Array ( ) [filter] => raw ) ) [collection_profile_note] => 2 ) ) 的数组键/值排序。我所尝试的(到目前为止)是:

collection_profile_note

虽然它确实更改了显示的顺序而没有$collection_rows = get_field('collection_profiles'); print_r($collection_rows); if ($collection_rows) { echo '<h2>'.__('Profiles in Collection','roots').'</h2>'; echo '<ul>'; function cmp($a, $b) { if ($a->collection_profile_note == $b->collection_profile_note) { return 0; } else { return $a->collection_profile_note < $b->collection_profile_note ? 1 : -1; } } usort($collection_rows, 'cmp'); foreach($collection_rows as $collection_row) { // Extract single post value $collection_profile_field = $collection_row['collection_profile']; $collection_profile_page = isset($collection_profile_field[0]) ? $collection_profile_field[0]->ID : NULL; ?> <li><a href="<?php echo get_permalink($collection_profile_page); ?>"><?php echo get_the_title($collection_profile_page); ?></a> <?php echo $collection_row['collection_profile_note']; ?></li> <?php } echo '</ul>'; } ,但它没有按照我想要的顺序排序 - &gt;功能(2,3,1),无功能(1,3,2)

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

好吧,你已经向后实施了排序逻辑:

function cmp($a, $b) {
    if ($a->collection_profile_note == $b->collection_profile_note) {
        return 0;
    } else {
        return $a->collection_profile_note < $b->collection_profile_note ? 1 : -1;
    }
}

来自documentation for uasort()

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

请注意,您正在使用此逻辑:

  • 如果&lt; b,返回1(实质上,告诉排序功能a> b)
  • 如果a&gt; b,返回-1(实质上,告诉排序函数a&lt; b)

答案 1 :(得分:0)

您是否有必要对阵列进行排序?可能更容易打破你正在排序的键和值,对它们进行排序,然后循环遍历该数组(如此):

$sortme=array();
foreach( $collection_rows as $key=>$profile )
{
    $sortme[$key] = $profile['collection_profile_note'];
}

asort($sortme);

foreach( $sortme as $node=>$ignore ) 
{
    print_r($collection_rows[$node]);
}

承认这几乎是整理时间的两倍,但也许足以满足您的需求?