在PHP中按特定顺序对对象数组进行排序

15

我在PHP中有两个数组。第一个数组($author_array)按特定顺序由用户ID组成,例如:(8, 1, 6)

第二个数组($user_results)由对象数组组成,如下所示:

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [user_login] => user1
        )
    [1] => stdClass Object
        (
            [ID] => 6
            [user_login] => user6
        )
    [2] => stdClass Object
        (
            [ID] => 8
            [user_login] => user8
        )
)
我希望对第二个数组进行“排序”,使其按照第一个数组的值的顺序(8、1、6)排列。因此,它应该是这样的:
Array
(
    [0] => stdClass Object
        (
            [ID] => 8
            [user_login] => user8
        )
    [1] => stdClass Object
        (
            [ID] => 1
            [user_login] => user1
        )
    [2] => stdClass Object
        (
            [ID] => 6
            [user_login] => user6
        )
)

我在数据结构方面不太擅长。我应该怎么做呢? :-)

提前感谢你的帮助!

-Bob

4个回答

30

使用usort,并提供一个自定义的比较函数,该函数使用您的“排序”数组中键的位置来确定排序顺序,例如:

function cmp($a, $b) 
{
   global $author_array;

   $pos1=array_search ($a->ID, $author_array);
   $pos2=array_search ($b->ID, $author_array);

   if ($pos1==$pos2)
       return 0;
   else
      return ($pos1 < $pos2 ? -1 : 1);

}


usort($user_results, "cmp");

1
为什么是-1?这展示了一种有效的技术,可能是OP不知道的,并且与其他答案不同,因为它执行“原地”排序而不是复制原始数组。 - Paul Dixon
3
谁在理智的情况下会在问题是自定义排序时downvote一个usort()解决方案呢? :| +1 - gnud
这是PHP语言开发者推荐的解决方案。 - Jacco
这个在我的代码里很好用。现在我会努力理解它是如何工作的! :-) - bobbyh

3

我不确定这个方法是否比其他例子慢很多,但是它看起来更简单。你可以一开始就构建一个关联数组 $user_results,使用 ID 作为键,然后你可以轻松地进行查找。

$hash = array();
$result = array();

foreach ($user_results as $obj) {
    $hash[$obj->ID] = $obj;
}

foreach ($author_array as $id) {
    $result[] = $hash[$id];
}

1

我遇到了类似的问题,但是我试图按一个不是对象的数组对一个对象进行排序。这是不可能的,所以这是我的解决方法:

$sort_array= array(11, 4, 16, 19, 23);
$myobject = sort_categories($myobject)

function cmp($a, $b) { 
    if ($a->sort_key == $b->sort_key) { return 0; }
    return ($a->sort_key < $b->sort_key) ? -1 : 1;
}
function sort_categories($obj) {
    global $sort_array;

    foreach($obj as $cat) {
        $cat->sort_key = 999;
        for ($i=0;$i<count($sort_array);$i++) {
            if ($sort_array[$i] == $cat->term_id) $cat->sort_key = $i;
        }
    }
    usort($obj,'cmp');
    return $obj;
}

我正在查看对象并添加一个名为 "sort_key" 的新属性,然后我们将使用它来通过 usort() 和 cmp() 进行排序。默认情况下,新的 sort_key 将是999,因此它会被卡在末尾。

0
public static function reorganizeBykey ($objects, array $keys){
    $results = array();
    foreach($keys as $key){
        $i=0;
        foreach($objects as $object){
            if($object->sourceName==$key){
                $results[$i] = $object;
            }
            $i++;
        }
    }
    $others = (array_diff_assoc($objects,$results));
    $results = array_merge($results,$others);
    return $results;
}

希望这对你有所帮助 - 我必须使用它来按一些键(keys())对一个array()进行排序,然后将不匹配的内容附加到末尾。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接