【问题标题】:PHP Merge & Sort Several Different Arrays of ObjectsPHP合并和排序几个不同的对象数组
【发布时间】:2013-09-18 19:37:16
【问题描述】:

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

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

【问题讨论】:

  • 你的代码在哪里,你试过什么?
  • 所有对象都有时间戳字段吗?
  • 老实说,我不知道如何达到我想要的效果。关于代码,如果我要发布代码,它只会是一个 codeigniter 控制器,其中包含几个存储在变量中的对象数组,我认为这会会有所帮助,但如果可以帮助您将其可视化,我可以发布 2 个虚拟对象数组?

标签: php arrays sorting object merge


【解决方案1】:

您可以利用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 不保持元素比较相等的原始顺序。

【讨论】:

  • 这似乎是一个不错的解决方案,但是如果两个时间戳相同会发生什么?
  • 检查usort 的手动条目。 compare 函数旨在返回一个负数、0 或一个正数,指示两个参数之间的相对顺序。如果它们相同,则函数将返回 0(表明为了比较排序,这两个对象是相同的)
  • 我想这是一个完全不同的问题,但你知道我将如何删除重复的项目(我会通过 content_id 字段验证它们是否重复)
  • 我认为您首先应该尽量不要重复。您不想删除比较函数中的重复项,但如果您必须在输入中有重复项,则必须对其进行迭代,并在迭代中迭代列表的其余部分以查看当前元素是否重复。
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多