PHP Merge&排序几个不同的对象数组

时间:2013-09-18 19:37:17

标签: php arrays sorting object merge

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

我有适当的功能,可以单独获取每种类型的内容并将它们放在对象数组中。所以有一个状态对象数组,一个照片对象数组等。每个对象数组中的每个对象都有一个时间戳字段,我想将所有这些对象数组合成一个按时间戳字段排序的所有对象共享的对象数组,但我不确定如何执行此操作?

1 个答案:

答案 0 :(得分: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不保持元素比较的原始顺序相等。