PHP - объединить подмассивы и отсортировать по значению? - PullRequest
2 голосов
/ 20 сентября 2010

Вот что я получил сейчас:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 53
                    [date] => 18 Sep 2010 10:29
                    [user] => 52
                    [post] => ytiuy
                )

            [1] => Array
                (
                    [id] => 55
                    [date] => 11 Sep 2010 11:14
                    [user] => 52
                    [post] => this is a test post :]
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [id] => 56
                    [date] => 4 Sep 2010 03:19
                    [user] => 55
                    [post] => pppost :DD:D:D:D
                )

        )

)

Я хочу удалить первые два «шага» в массиве, а затем отсортировать массив по значению «дата», например так:

Array
(
    [0] => Array
        (
            [id] => 56
            [date] => 4 Sep 2010 03:19
            [user] => 55
            [post] => pppost :DD:D:D:D
        )

    [1] => Array
        (
            [id] => 55
            [date] => 11 Sep 2010 11:14
            [user] => 52
            [post] => this is a test post :]
        )

    [2] => Array
        (
            [id] => 53
            [date] => 18 Sep 2010 10:29
            [user] => 52
            [post] => ytiuy
        )
)

Есть идеи?

Спасибо большое, спасибо за помощь!:)

РЕДАКТИРОВАТЬ: Я должен также отметить, что количество элементов массива не всегда будет одинаковым.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Вы должны иметь возможность использовать шаблон аккумулятора с функцией array_merge для объединения всех массивов нижнего уровня.

$result = array();
foreach ($oldarray as $child)
{
    $result = array_merge($result, $child);
}

Наконец, вы можете использовать пользователя определенная сортировка функция сортировки целиком.

1 голос
/ 20 сентября 2010

Альтернативой решению Дона Кирби было бы использовать SplMaxHeap, который позволил бы вам выполнять итерацию и сортировку за один раз:

class PostHeap extends SplMaxHeap
{
    public function compare($post, $other)
    {
        return strtotime($post['date']) - strtotime($other['date']);
    }
}

$postHeap = new PostHeap;
foreach($posts as $subArray) {
    foreach($subArray as $post) {
        $postHeap->insert($post);
    }
}

Тогда $postHeapсодержать сообщения в порядке убывания даты, например, сначала самая новая дата.Вы можете использовать код в функции compare, если хотите вместо этого использовать usort.Тогда порядок будет возрастать.

0 голосов
/ 20 сентября 2010

У вас есть два массива?Или больше?Они уже отсортированы?Если это так, вы можете использовать это, чтобы объединить их более эффективно.Если нет, то вам, вероятно, нужно сначала отсортировать их.

Примерно:

  1. Сортировать входные массивы (опционально)
  2. Сканировать входные массивы на наличие наименьшего значения,скопируйте это значение в ваш новый массив, удалите его из входного массива.
  3. Повторяйте, пока все ваши входные массивы не станут пустыми.

Конечно, если вам все равноПо производительности, вы можете просто объединить все массивы, а затем отсортировать их.

А для сортировки вы можете использовать: http://www.php.net/manual/en/function.sort.php#99700

@ Дон Киркби: Действительно: это в основном mergesort , но работает только с уже отсортированными массивами.Если они оба не отсортированы, вам, вероятно, лучше объединить их и использовать вместо них быструю сортировку.

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