У вас есть массив:
$array = array(
'note' => array('note1', 'note2', 'note3'),
'text' => array('text1', 'text2', 'text3'),
'year' => array('2002', '2000', '2011')
);
И порядок чего-то:
$sortBy = array('2011', '2000', '2002');
$sortOrder = $array['year'];
Затем выяснить, как год должен быть отсортирован:
array_walk($sortOrder, function(&$v) use ($sortBy) {$v = array_search($v, $sortBy);});
Чтобы затем отсортировать весь массив, основанный на таком порядке:
array_multisort($sortOrder, $array['note'], $array['text'], $array['year']);
Полный текст:
$array = array(
'note' => array('note1', 'note2', 'note3'),
'text' => array('text1', 'text2', 'text3'),
'year' => array('2002', '2000', '2011')
);
$sortBy = array('2011', '2000', '2002');
$sortOrder = $array['year'];
array_walk($sortOrder, function(&$v) use ($sortBy) {$v = array_search($v, $sortBy);});
array_multisort($sortOrder, $array['note'], $array['text'], $array['year']);
Выход/Demo:
Array(
[note] => Array(
[0] => note3
[1] => note2
[2] => note1
)
[text] => Array(
[0] => text3
[1] => text2
[2] => text1
)
[year] => Array(
[0] => 2011
[1] => 2000
[2] => 2002
)
)
Edit: Подключенный вариант, бережет array_search
:
$sortBy = array_flip(array('2011', '2000', '2002'));
$sortOrder = $array['year'];
array_walk($sortOrder, function(&$v) use ($sortBy) {$v = $sortBy[$v];});
array_multisort($sortOrder, $array['note'], $array['text'], $array['year']);
edit2: PHP 5.2, завернутые в одну функцию, полная параметризация:
/**
* @param array $array
* @param string|int $by key/offset
* @param array $order
* @return array
*/
function array_multisort_by_order(array $array, $by, array $order)
{
$order = array_flip($order);
$params[] = $array[$by];
foreach($params[0] as &$v) $v = $order[$v];
foreach($array as &$v) $params[] = &$v; unset($v);
call_user_func_array('array_multisort', $params);
return $array;
}
// Usage:
array_multisort_by_order($array, 'year', array('2011', '2000', '2002'));
Здесь я чувствую себя немного мусором. – hakre
@hakre, ты уверен? Я не думаю, что это подходит. – goat
@rambocoder: Посмотрите здесь: http://stackoverflow.com/a/11022569/367456 - это многопользовательский режим (и вы можете дополнительно использовать сопоставление 'array_flip', которое вы используете). – hakre