Создать и отсортировать новый массив по времени - PullRequest
1 голос
/ 13 июля 2011

У меня есть массив, похожий на этот

Array
(
    [0] => Array
        (
            [showname] => White Collar
            [air_time] => 1310590800
        )

    [1] => Array
        (
            [showname] => Chopped
            [air_time] => 1310590800
        )

    [2] => Array
        (
            [showname] => Covert Affairs
            [air_time] => 1310587200
        )
    } ... etc

Я хочу создать новый массив, отсортированный по air_time. например, все шоу, содержащие одинаковое эфирное время, должны быть в [0], затем [1], затем [2] и т. д.

Пример вывода, который мне нужен, это:

Array
(
    [0] => Array
        (
            [time] => 1310590800
            [shows] => Array
                (
                    [name] => White Collar
                    [name] => Chopped
                )

        )

    [1] => Array
        (
            [time] => 1310587200
            [shows] => Array
                (
                    [name] => Covert Affairs
                )

        )
}

Я смотрел на различные методы массива, такие как мультисортировка, но я не смог понять это.

Не могли бы вы указать мне правильное направление? спасибо

обновление я знаю, как отсортировать массив по времени, я просто не знаю, как я могу разделить и сгруппировать элементы, которые имеют одинаковое время

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Попробуйте использовать usort .Приведенная ссылка имеет несколько рабочих примеров.

0 голосов
/ 14 июля 2011

Это не так сложно, если вы обернетесь вокруг него.Кстати, вы не можете иметь несколько элементов массива с одним и тем же именем ключа.

$shows = array(
    array(
        'showname' => 'White Collar',
        'air_time' => 1310590800
    ),
    array(
        'showname' => 'Covert Affairs',
        'air_time' => 1310587200
    ),
    array(
        'showname' => 'Chopped',
        'air_time' => 1310590800
    )
);

/* Sort by air_time (descending) */
usort($shows, function ($a, $b) {
    return ($b['air_time'] - $a['air_time']);
});


/* Regroup array (utilizing the fact that the array is ordered) */
$regrouped = array();
$c = 0;
foreach ($shows as $show) {
    if ($c > 0 && $regrouped[$c - 1]['time'] === $show['air_time']) {
        $regrouped[$c - 1]['shows'][] = $show['showname'];
    } else {
        $regrouped[] = array('time'  => $show['air_time'],
                             'shows' => array($show['showname']));
        $c++;
    }
}

print_r($regrouped);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...