通过内部数组字段排序数组

时间:2014-09-14 13:28:39

标签: php arrays sorting

我有这个数组,

Array
(
    [0] => Array
        (
            [ID] => 108
            [custom] => Array
                (
                    [date_tps] => Array
                        (
                            [0] => 14.07.2014
                        )
                )
        )

    [1] => Array
        (
            [ID] => 123
            [custom] => Array
                (
                    [date_tps] => Array
                        (
                            [0] => 22.07.2014
                        )
                )
        )

    [2] => Array
        (
            [ID] => 152
            [custom] => Array
                (
                    [date_tps] => Array
                        (
                            [0] => 23.06.2014
                        )
                )
        )

    [3] => Array
        (
            [ID] => 153
            [custom] => Array
                (
                    [date_tps] => Array
                        (
                            [0] => 06.07.2014
                        )
                )
        )
)

我正在尝试按日期date_tps[0]字段对其进行排序,从新日期到旧日期。 谁能指导我如何完成它? 我已经尝试使用php函数进行排序(那些带有$ a- $ b)但是它没有用(我猜它是因为它真的在很多数组中。 非常感谢!

1 个答案:

答案 0 :(得分:1)

是的,您需要usort()

简单的障碍是你需要在可比性之前先将时间转换成内部。

$values = array(
    array('ID' => 108, 'custom' => array('date_tps' => array('14.07.2014'))),
    array('ID' => 123, 'custom' => array('date_tps' => array('22.07.2014'))),
    array('ID' => 152, 'custom' => array('date_tps' => array('23.06.2014'))),
    array('ID' => 108, 'custom' => array('date_tps' => array('06.07.2014'))),
);

usort($values, function($a, $b){
    $v1 = $a['custom']['date_tps'][0];
    $v2 = $b['custom']['date_tps'][0];
    $v1 = DateTime::createFromFormat('d.m.Y', $v1); // convert them properly first
    $v2 = DateTime::createFromFormat('d.m.Y', $v2);
    return $v1->getTimestamp() - $v2->getTimestamp();
    // or
    return $v1->format('U') - $v2->format('U');
});

echo '<pre>';
print_r($values);

Demo