这应该相当简单,但我的大脑目前似乎无法处理这个问题。希望你能帮忙:)。
我有一系列帖子,每个帖子都有一个标签,看起来像这样:
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函数可以打电话,你能指教吗?
答案 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()