2015-10-09 5 views
1

Ok. Я столкнулся с некоторыми сообщениями с одним и тем же вопросом, но я все еще не могу понять, как сортировать следующий массив.Php сортировка многомерного массива

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

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

Любая помощь приветствуется!

*** EDIT

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

ответ

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»? или, возможно, как мне пришлось назначать значения в массиве на первое место – Arash

+0

Мое решение не лучшее, поскольку я не использовал 'array_multisort'. Теперь я прочитал другие ответы, я думаю, что @delprks может быть лучше для этого случая. Я попытаюсь что-то придумать. –

+0

Я отредактировал свой ответ, чтобы использовать массивы array_multisort в * brand * и * project *. –

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); добавить поле проекта? – Arash

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); 
Смежные вопросы