PHP根据另一个数组的顺序对数组进行排序/排序

时间:2013-12-06 20:02:53

标签: php arrays

这应该相当简单,但我的大脑目前似乎无法处理这个问题。希望你能帮忙:)。

我有一系列帖子,每个帖子都有一个标签,看起来像这样:

Array(
   [0] = Array('Computers', postObject),
   [1] = Array('Sports', postObject),
   [2] = Array('Computers', postObject),
   [3] = Array('Business', postObject)
)

我使用asort()似乎按字母顺序对帖子进行排序,但我现在需要根据可能有额外值的指定顺序(存储在数组中)对帖子进行排序。

Array(
   [0] = 'Sports',
   [1] = 'Fashion',
   [2] = 'Business',
   [3] = 'Computers',
   [4] = 'Stocks'
 )

我希望第一个数组按如下方式排序:

Array(
   [0] = Array('Sports', postObject),
   [1] = Array('Business', postObject),
   [2] = Array('Computers', postObject),
   [3] = Array('Computers', postObject)
)

我不认为有一个简单的PHP函数可以打电话,你能指教吗?

2 个答案:

答案 0 :(得分:0)

您可以使用usort函数,该函数使用用户定义的比较函数对数组进行排序。

未经测试的解决方案可以是:

$categories = array_flip($categories); // not needed by original solution
usort($posts, function($a, $b) use ($categories) {
    // original solution:
    // return array_search($a[0], $categories) > array_search($b[0], $categories);

    // shameless CAP (copy-and-paste) from Mike Brant's answer
    // actually, performs better, and I hope that he doesn't mind :)
    return $categories[$a[0]] > $categories[$b[0]];

});

此解决方案适用于PHP v> = 5.3,因为它使用anonymous functions and closures

如果您使用的是PHP< 5.3,您可以使用ksort函数,这样(再次,未经测试):

$new_arr = array();
$categories = array_flip($categories);
foreach ($posts as $post) {
    $new_arr[$categories[$post[0]]] = $post;
}
ksort($new_arr);

答案 1 :(得分:0)

我会考虑usort()。例如:

$array = array(...); // your multi-dimension array to sort
$sort_order_array = array(...); // your array defining sort order
$sort_order_array_flipped = array_flip($sort_order_array);

usort($array, function($a, $b) use ($sort_order_array_flipped) {
    return $sort_order_array_flipped[$a[0]] > $sort_order_array_flipped[$b[0]];
});

请注意,我翻转了排序顺序数组,以便根据存储在主数组中的值轻松查找顺序值(0,1,2)。这实际上比每次迭代usort()

进行密钥循环计算速度快