1

我有一个 15000 个元素的数组,每个元素都是 4 个元素的数组。我想按 4 的第二个元素排序。最初我将原始数组的键作为第二个元素,然后进行 k 排序,但不幸的是,一些第二个元素是重复的,因为一个键不能引用多个元素我丢失了一些正在过渡的元素。我可以按第二个元素冒泡排序,但我正在寻找至少按 nlog(n) 顺序运行的东西。谁能想到一个可以按第二个元素排序的好算法(或者可能是我不知道的php函数)?谢谢!

4

3 回答 3

3

我认为您可以使用usort并定义 cmp_function 以使用第二个元素。

于 2010-07-13T02:07:33.487 回答
1

正如其他人所说,维护数组键的usortuasort是您想要的:

<?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');
于 2010-07-13T02:48:19.477 回答
0

我不知道usort的内部实现是什么,但我敢打赌它比冒泡排序更好(它可能是快速排序)。

于 2010-07-13T02:09:02.347 回答