Сортировка массива массивов в PHP -> нужен хороший алгоритм - PullRequest
1 голос
/ 13 июля 2010

У меня есть массив из 15000 элементов, каждый из которых представляет собой массив из 4 элементов. Я хочу отсортировать по второму элементу из 4. Первоначально я сделал ключи исходного массива вторым элементом, а затем отсортировал по k, но, к сожалению, некоторые из вторых элементов являются дубликатами, и поскольку один ключ не может ссылаться на несколько элементов, которые я потерял некоторые элементы в переходе. Я мог бы сортировать пузырьки по второму элементу, но я ищу что-то, что работает по крайней мере порядка nlog (n). Может кто-нибудь придумать хороший алгоритм (или, возможно, функцию в php, о которой я не знаю), которая может сортировать по второму элементу? Спасибо!

Ответы [ 3 ]

3 голосов
/ 13 июля 2010

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

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

Как уже говорили другие, usort или uasort для поддержки ключей массива - это то, что вы хотите:

<?php

$myArray = array(
    'fruits' => array(
        array('apples', 'oranges', 'bananas')              
    ),
    'vegetables' => array(
        array('lettuce', 'carrots', 'peas')
    ),
    'monkeys' => array(
        array('Curious George', 'Amy', 'Marcel')
    )
);

// PHP 5.3+ example using a closure

uasort($myArray, function(array $a, array $b) {
    // Use whatever sorting algorithm you like
    return strnatcasecmp($a[1], $b[1]); 
});

var_export($myArray);

Выполнение вышеизложенного выдаст:

array (
  'monkeys' => 
  array (
    0 => 
    array (
      0 => 'Curious George',
      1 => 'Amy',
      2 => 'Marcel',
    ),
  ),
  'vegetables' => 
  array (
    0 => 
    array (
      0 => 'lettuce',
      1 => 'carrots',
      2 => 'peas',
    ),
  ),
  'fruits' => 
  array (
    0 => 
    array (
      0 => 'apples',
      1 => 'oranges',
      2 => 'bananas',
    ),
  ),
)

Вот пример, в котором не используется замыкание для предварительной версии PHP 5.3:

sortFunc(array $a, array $b)
{
    return strnatcasecmp($a[1], $b[1]); 
}

uasort($myArray, 'sortFunc');
0 голосов
/ 13 июля 2010

Я не знаю, какова внутренняя реализация usort , но я бы поспорил, что это лучше, чем пузырьковая сортировка (вероятно, быстрая сортировка).

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