Как отсортировать следующий массив?
У меня есть многомерный массив, который заполняется общим количеством часов для каждого бренда
$totalHours = array(
'brand' => array(),
'project' => array(),
'hours' => array()
);
Вывод примерно такой (проект не заполнен):
array(3) {
["brand"]=>
array(3) {
[0]=>
string(4) "Nike"
[1]=>
string(9) "Coke Cola"
[2]=>
string(8) "Converse"
}
["project"]=>
array(3) {
[0]=>
string(6) "Bonobo"
[1]=>
string(4) "LDRU"
[2]=>
string(2) "US"
}
["hours"]=>
array(3) {
[0]=>
int(28)
[1]=>
int(106)
[2]=>
string(1) "2"
}
}
Теперь я бы хотел отсортировать массив по полю "часы".
Я пробовал array_multisort, но, похоже, я просто не понимаю, как работает эта функция и как применить ее к этому массиву. Я был в состоянии отсортировать один массив только с одной строкой значений. Если я применяю это к этой проблеме, я сортирую только поле часов, оставляя остальные не отсортированными, и, следовательно, массив поврежден.
"Проект" действительно содержит строку. Это всегда так. В этом примере я не заполнил его.
Этот формат данных не очень удобен, потому что нет прямой связи между брендами и часами, они даже сидят в разных массивах! Кроме того, последний час - это строка, а не целое число.
Нам нужно создать промежуточный массив, чтобы связать их и отсортировать. Затем мы снова введем все в исходный массив.
// Make sure both arrays of brands and hours and the same size
if (count($totalHours['brand']) != count($totalHours['hours'])) {
throw new Exception('Invalid data!');
}
// Make sure every hour record is an integer, not a string
$totalHours['hours'] = array_map('intval', $totalHours['hours']);
// array_combine will sort all arrays based on the sorting of the first one
array_multisort($totalHours['hours'], $totalHours['brand'], $totalHours['project']);
EDIT: Использование array_multisort
было идеей @delprks. Здесь я применил его как к марке, так и к проектным массивам.
array_multisort должен работать:
$totalHours = array(
'brand' => array('Nike', 'Coke Cola', 'Converse'),
'project' => array(),
'hours' => array(28, 106, '2')
);
array_multisort($totalHours['hours'], $totalHours['brand']);
var_dump($totalHours);
Вы не можете сделать это с помощью одной функции array_ * !
если (проект не заполнен) всегда и индексы бренда и часов равны, то вы можете сделать:
$forsort = array_combine($totalHours["brands"],$totalHours["hours"]);
asort($forsort,SORT_NUMERIC);
$totalHours["brands"]=array_keys($forsort);
$totalHours["hours"]=array_values($forsort);
Но это всего лишь ответ на ваш вопрос, а не лучшая практика.
array_multisort
. Теперь я читаю другие ответы, думаю, что @delprks лучше подойдет для этого случая. Я постараюсь что-то придумать.