0

我有一个使用 codeigniter REST api 的社交网络应用程序,我们的一个功能是新创建内容的提要,到目前为止,这仅包含用户状态,但现在我喜欢在提要中添加各种不同的内容(更新、照片、用户交互等)

我有适当的功能,可以单独抓取每种类型的内容并将它们放置在对象数组中。所以有一个状态对象数组,一个照片对象数组等。每个对象数组中的每个对象都有一个时间戳字段,我想将所有这些对象数组合并到一个对象数组中按所有对象共享的时间戳字段排序,但我不知道该怎么做?

4

1 回答 1

0

您可以利用usort进行排序,只要每个对象都有一个公共时间戳字段

function compareObjTimestamps( $a, $b ) {
    return $a->timestamp - $b->timestamp;
}

usort( $objArray, 'compareObjTimestamps' );

对于合并,遵循这种方法只需在调用之前将所有对象集中到一个数组中usort

例子

<?php

class A {
    public $sortField;

    public function __construct( $sortField ) {
        $this->sortField = $sortField;
    }
}

class B {
    public $sortField;

    public function __construct( $sortField ) {
        $this->sortField = $sortField;
    }

}

function compare( $a, $b ) {
    return $a->sortField - $b->sortField;
}


$test = array(
    new A(1),
    new B(2),
    new A(3),
    new B(4),
    new B(1),
    new A(17),
    new B(10),
);

usort( $test, 'compare' );

foreach( $test as $entry ) {
    echo $entry->sortField . ': ' . get_class( $entry ) . "\n";
}

此脚本的多次迭代产生以下输出:

1: B 
1: A 
2: B 
3: A 
4: B 
10: B 
17: A

因此,看起来输入中稍后出现的任何内容都将首先出现在输出中,尽管我找不到任何关于此的文档。手册简单地说:

4.1.0 引入了新的排序算法。cmp_function 不保持元素比较相等的原始顺序。

于 2013-09-18T19:51:06.397 回答