使用usort重新排列多维数组

时间:2012-12-18 23:01:18

标签: php arrays json usort

我有一个大数组(这只是它的一部分):

[0] => stdClass Object
    (
        [products] => Array
            (
                [0] => stdClass Object
                    (
                        [body_html] => bodyhtml
                        [published_at] => 2012-12-16T23:59:18+00:00
                        [created_at] => 2012-12-16T11:30:24+00:00
                        [updated_at] => 2012-12-18T10:52:14+00:00
                        [vendor] => Name
                        [product_type] => type
                    )
                [1] => stdClass Object
                    (
                        [body_html] => bodyhtml
                        [published_at] => 2012-12-16T23:59:18+00:00
                        [created_at] => 2012-12-16T10:30:24+00:00
                        [updated_at] => 2012-12-18T10:52:14+00:00
                        [vendor] => Name
                        [product_type] => type
                    )
              )
      )

我需要在创建之日安排每个产品...... 我尝试过各种各样的usort,ksort,uksort技术,试图让它按特定顺序(按时间顺序排列)但失败了!

任何指导都将非常受欢迎

2 个答案:

答案 0 :(得分:1)

您需要使用uasort函数,它允许您指定您编写的简单比较函数。有关详细信息,请参阅uasort。您还可以将匿名函数定义为uasort调用的一部分。由于您有一个包含数组的对象,因此请确保将对象的数组传递给uasort函数。由于您正在对一组对象进行排序,因此您的比较函数应考虑到它正在使用2个对象。

以您的回复和您的var_dump为基础:

uasort($foo[0]->products, function($a, $b) {

    if ($a->created_at < $b->created_at) {
        return -1;
    }
    return 1;
});

答案 1 :(得分:0)

以下是一个例子:

$arr_1 = array('name' => 'A', 
               'date' => '2012-12-16T11:30:24+00:00' , 
               'created_at' => '2012-12-16T11:30:24+00:00');
$arr_2 = array('name' => 'B', 
               'date' => '2012-12-16T11:30:22+00:00' , 
               'created_at' => '2012-12-16T11:30:21+00:00');


$test_array = array($arr_1, $arr_2);
var_dump($test_array);

usort($test_array, function($a, $b) {
    $a_date = new DateTime($a['date']);
    $b_date = new DateTime($b['date']);
    if ($a_date < $b_date) {
        return -1;
    }
    return 1;
});

var_dump($test_array);