Php сортировка многомерного массива?

1

Как отсортировать следующий массив?

У меня есть многомерный массив, который заполняется общим количеством часов для каждого бренда

$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, но, похоже, я просто не понимаю, как работает эта функция и как применить ее к этому массиву. Я был в состоянии отсортировать один массив только с одной строкой значений. Если я применяю это к этой проблеме, я сортирую только поле часов, оставляя остальные не отсортированными, и, следовательно, массив поврежден.

"Проект" действительно содержит строку. Это всегда так. В этом примере я не заполнил его.

Теги:
arrays
multidimensional-array
sorting

3 ответа

1
Лучший ответ

Этот формат данных не очень удобен, потому что нет прямой связи между брендами и часами, они даже сидят в разных массивах! Кроме того, последний час - это строка, а не целое число.

Нам нужно создать промежуточный массив, чтобы связать их и отсортировать. Затем мы снова введем все в исходный массив.

// 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. Здесь я применил его как к марке, так и к проектным массивам.

  • 0
    Огромное спасибо. Не могли бы вы помочь мне, как применить это, включая массив 'project'? или, возможно, как я должен был присвоить значения в массиве на первом месте
  • 0
    Мое решение не лучшее, так как я не использовал array_multisort . Теперь я читаю другие ответы, думаю, что @delprks лучше подойдет для этого случая. Я постараюсь что-то придумать.
Показать ещё 2 комментария
2

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);
0

Вы не можете сделать это с помощью одной функции array_ * !

если (проект не заполнен) всегда и индексы бренда и часов равны, то вы можете сделать:

$forsort = array_combine($totalHours["brands"],$totalHours["hours"]);
asort($forsort,SORT_NUMERIC);
$totalHours["brands"]=array_keys($forsort);
$totalHours["hours"]=array_values($forsort);

Но это всего лишь ответ на ваш вопрос, а не лучшая практика.

  • 0
    Могу ли я просто добавить еще $ totalHours ["projects"] = array_values ($ forsort); добавить поле проекта?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню