按函数内的属性值对对象数组进行排序

时间:2017-11-12 17:01:06

标签: php wordpress

我有一个返回对象数组的函数。这是我的功能

public function myFunction () {
  $args = [
      'post_type' => 'post',

  ];
  $data = \WordPress\Query::get_posts($args);

  $now = time();
  foreach ($data as $key => $datas) {
    $eventTime = $datas->endtime;
    $eventTimeStr = strtotime($eventTime);
    if ($eventTimeStr < $now) {
      unset($data[$key]);
    }
  }
 return $data;
}

这将返回如下对象数组:

Array
(
   [0] => WP_Post Object
    (
        [ID] => 14
        [metadata] => Array
            (
                [post_title] => Event number 3
                [starttime] => 24.11.2019
                [endtime] => 25.11.2019
            )

    )

   [1] => WP_Post Object
    (
        [ID] => 13
        [metadata] => Array
            (
                [post_title] => Event number 1
                [starttime] => 19.1.2017
                [endtime] => 20.1.2017
            )
    )
    [2] => WP_Post Object
    (
        [ID] => 10
        [metadata] => Array
            (
                [post_title] => Event number 2
                [starttime] => 19.1.2018
                [endtime] => 20.1.2018
            )

    )

)

如何按属性“endtime”对数组进行排序,以便“事件编号1”是列表中的第一个,“事件编号2”秒等等?

我尝试在myFunction()中使用usort-function但是没有成功。我应该在myFunction()之外创建另一个函数并从那里访问$ data-variable吗?如果是这样,怎么样?

在myFunction()中,我将日期格式化为Unix时间戳。我可能应该用它吗?

2 个答案:

答案 0 :(得分:0)

一如既往,排序算法使用场景后面的比较函数通过比较两个元素对整个数组进行排序,对于这样的复杂事物进行排序,应该编写比较函数并定义那里的逻辑进行排序

function compare($a, $b)
{
    return strtotime($a->metadata['endtime']) < strtotime($b->metadata['endtime']);
}

usort($yourarray, 'compare');

答案 1 :(得分:-1)

我想你应该创建另一个函数来获取你的对象数组并返回它们的排序。您可以使用一些简单的排序算法。此外,您还需要编写函数,该函数通过它的结束时间返回最大对象。

function sortObjects($objects){
    $sorted_array = array();
    for($i=0;$i<count($objects);$i++){
        $max = getMax($objects);
        $max_object = $max["object"];
        $max_index = $max["index"];
        unset($objects[$max_index]);
        array_push($sorted_array, $max_object);
    }
    return $sorted_array;
}
function getMax($objects){
    $index = 0;
    $max = $objects[$index];

    for($i=1;i<count($objects);$i++){
        if(strtotime(str($objects[i]->metadata->endtime))>strtotime(str($max))){
            $max = $objects[i];
            $index = $i;
        }
    }
    return array("object"=>$max, "index"=>$index);
}

在myFunction()返回的对象上使用它。

$sorted = sortObjects(myfunction());