используйте usort, который является эффективным алгоритмом PHP и может работать в зависимости от предоставленных вами условий.
http://php.net/manual/en/function.usort.php
Вот бегущий код, вы можете сравнить его с вашими данными:
http://codepad.org/MRpZQkKk
Это даст вам больше контроля, если вы захотите изменить критерии сортировки,
также сложность довольно быстрая, она должна быть O (n log n) (внутренняя сортировка),
и сложность пространства также низкая.
Вот больше об этом:
Какие алгоритмы сортировки применяется в usort?
<?php
$items = array(
array("id" => "…", "type" => "alpha"),
array("id" => "…", "type" => "beta"),
array("id" => "…", "type" => "company"),
array("id" => "…", "type" => "marketing"),
array("id" => "…", "type" => "beta"),
array("id" => "…", "type" => "company"),
array("id" => "…", "type" => "alpha"),
array("id" => "…", "type" => "alpha"),
array("id" => "…", "type" => "company"),
array("id" => "…", "type" => "marketing"),
);
$order = array("company", "marketing", "alpha", "beta" );
$orderIndexes = array(); /* cache indexes of the order keys */
for($i = 0 ; $i < count($order) ; $i++ )
{
$orderIndexes[$order[$i]] = $i ;
}
/* we have something like :
$orderIndexes = array('company' => 0 , 'marketing' => 1 , ....);
*/
function myCriteria($item1,$item2) /* this is the function used to decide order */
{ global $orderIndexes;
$index1 = $orderIndexes[$item1['type']];
$index2 = $orderIndexes[$item2['type']];
return $index1 - $index2 ; // negative means $item1 precedes $item2
}
usort($items,"myCriteria");
print_r($items);
?>