【问题标题】:How to sort an array based on multiple criteria?如何根据多个条件对数组进行排序?
【发布时间】:2014-03-15 11:09:12
【问题描述】:

我想按数组中的两个条件进行排序。 第一个标准是第二个类别和标题。

我尝试使用 usort() 但它不起作用。

有没有 php 函数可以做到这一点?

我原来的数组:

Array
(
    [0] => stdClass Object
    (
        [id] => 1
        [category] => cat1
        [title] => title1
    )
[1] => stdClass Object
    (
        [id] => 3
        [category] => cat2
        [title] => z
    )       
[2] => stdClass Object
    (
        [id] => 2
        [category] => cat1
        [title] => title2
    )
[3] => stdClass Object
    (
        [id] => 4
        [category] => cat2
        [title] => a
    )
)

我想要这个:

Array
(
    [0] => stdClass Object
    (
        [id] => 1
        [category] => cat1
        [title] => title1
    )
[1] => stdClass Object
    (
        [id] => 2
        [category] => cat1
        [title] => title2
    )       
[2] => stdClass Object
    (
        [id] => 4
        [category] => cat2
        [title] => a
    )
[3] => stdClass Object
    (
        [id] => 3
        [category] => cat2
        [title] => z
    )               
)

谢谢。

我没有尝试太多,因为我找到了一个方法:

usort($object, 'sort');
function sort($a,$b){
if($a->category == $b->category){
    if($a->title == $b->title){
        return 0;
    }else{
        return ($a->title < $b->title) ? -1 : 1;
    }
}else{
    return ($a->category < $b->category) ? -1 : 1;
}
}

但它也适用于 multisort() :

foreach ($object as $sort_key => $sort_row) {
    $category[$sort_key]  = $sort_row->acls_category;
    $title[$sort_key] = $sort_row->acls_title;
}
array_multisort($category, SORT_ASC, $title, SORT_ASC, $object);

【问题讨论】:

标签: php arrays sorting object


【解决方案1】:
$o1 = new stdClass;
$o1->id = 1;
$o1->category = 'cat1';
$o1->title = 'title1';

$o2 = new stdClass;
$o2->id = 3;
$o2->category = 'cat2';
$o2->title = 'z';

$o3 = new stdClass;
$o3->id = 2;
$o3->category = 'cat1';
$o3->title = 'title2';

$o4 = new stdClass;
$o4->id = 4;
$o4->category = 'cat2';
$o4->title = 'a';

$arr = array($o1, $o2, $o3, $o4);

usort($arr, function($a, $b) {
    $catCmp = strcmp($a->category, $b->category);

    if ($catCmp) {
        return $catCmp;
    }

    return strcmp($a->title, $b->title);
});

var_dump($arr);

【讨论】:

  • 谢谢您,它也可以按照您的指示工作。我添加了一个补充说明我的进展情况,因为我没有进行足够的搜索。
猜你喜欢
  • 2012-02-11
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2021-03-08
  • 1970-01-01
  • 2020-10-27
  • 2023-02-01
相关资源
最近更新 更多