2013-08-19 2 views
0

У меня есть этот пример массив, и я хотел бы, чтобы отсортировать каждый первый элемент уровня (66000, 66001, 66002) в следующем порядке: New Store первых в списке, Store Relocation второго места в списке, Я не включил Underperforming Stores в массив примеров, но они были бы последними. тогда их нужно сортировать по open date Как я могу отсортировать их таким образом?Сортировать многомерный массив в определенном порядке

Я считаю, что мне нужно использовать usort, но я действительно не понимаю функцию usort, могу ли я получить справку по этому вопросу?

Вот моя функция до сих пор ...

usort($mainpgArr, function($a, $b){ 

}); 

Пример исходного массива:

Array(
    [66000] => Array(
     [January] => Array(
      [status] => New Store 
      [sales] => 100.00 
      [open] => 2013-05-01 
     ) 
     [February] => Array(
      [status] => New Store 
      [sales] => 200.00 
      [open] => 2013-05-01 
     ) 
     [March] => Array(
      [status] => New Store 
      [sales] => 140.00 
      [open] => 2013-05-01 
     ) 
    ) 
    [66001] => Array(
     [January] => Array(
      [status] => Store Relocation 
      [sales] => 3400.00 
      [open] => 2013-07-01 
     ) 
     [February] => Array(
      [status] => Store Relocation 
      [sales] => 1340.00 
      [open] => 2013-07-01 
     ) 
     [March] => Array(
      [status] => Store Relocation 
      [sales] => 1550.00 
      [open] => 2013-07-01 
     ) 
    ) 
    [66002] => Array(
     [January] => Array(
      [status] => New Store 
      [sales] => 1050.00 
      [open] => 2013-01-01 
     ) 
     [February] => Array(
      [status] => New Store 
      [sales] => 1009.00 
      [open] => 2013-01-01 
     ) 
     [March] => Array(
      [status] => New Store 
      [sales] => 1020.00 
      [open] => 2013-01-01 
     ) 
    ) 
) 

Пример Окончательный массив

Array(
    [66002] => Array(
     [January] => Array(
      [status] => New Store 
      [sales] => 1050.00 
      [open] => 2013-01-01 
     ) 
     [February] => Array(
      [status] => New Store 
      [sales] => 1009.00 
      [open] => 2013-01-01 
     ) 
     [March] => Array(
      [status] => New Store 
      [sales] => 1020.00 
      [open] => 2013-01-01 
     ) 
    ) 
    [66000] => Array(
     [January] => Array(
      [status] => New Store 
      [sales] => 100.00 
      [open] => 2013-05-01 
     ) 
     [February] => Array(
      [status] => New Store 
      [sales] => 200.00 
      [open] => 2013-05-01 
     ) 
     [March] => Array(
      [status] => New Store 
      [sales] => 140.00 
      [open] => 2013-05-01 
     ) 
    ) 
    [66001] => Array(
     [January] => Array(
      [status] => Store Relocation 
      [sales] => 3400.00 
      [open] => 2013-07-01 
     ) 
     [February] => Array(
      [status] => Store Relocation 
      [sales] => 1340.00 
      [open] => 2013-07-01 
     ) 
     [March] => Array(
      [status] => Store Relocation 
      [sales] => 1550.00 
      [open] => 2013-07-01 
     ) 
    ) 
) 
+0

Что именно насчет 'usort' вы не понимаете? Есть примеры на php.net, вы их читали? Вы пробовали что-то простое, чтобы сначала намочить ноги? – Jon

ответ

0

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

В вашем случае было бы проще, если бы данные вашего массива немного подобрались, взяв статус из данных месяца. Как и нам, мы должны будем предположить, что все будет за все месяцы.

С учетом этого предположения мы будем использовать статус первых месяцев для нашего сравнения.

usort($mainpgArr, function($a, $b){ 
    if ($a[0]['status'] == $b[0]['status']) { 
     // status equal so sort by open date 
     if ($a[0]['open'] == $b[0]['open']) { 
      return 0; 
     } else { 
      return ($a[0]['open'] > $b[0]['open']) ? 1 : -1; 
     } 
    } else { 
     // sorting by status 
     // we can use a simple comparison operation as your desired order happens to be alphabetical 
     return ($a[0]['status'] > $b[0]['status']) ? 1 : -1; 
    } 
}); 

Если ключи являются важными для вас вы должны будете look at using uasort, как usort не сохраняет ключи.

-1

Вы не делаете это правильно.

Это очень просто: http://www.php.net/manual/en/function.ksort.php

ksort($mainpgArr); 

И это все люди. Теперь $ mainpgArr сортируется так, как вы этого хотите. Сортировка многомерной части будет с asort();


Извините, непонятый вопрос. Хорошо, вам нужно отсортировать ключи с помощью ksort(). Затем цикл через все это создает новый массив с отсортированными ключами в то время как asort() индексами ..

пример:

ksort($mainpgArr); 
foreach($mainpgArr as $key => $value) { 
    asort($mainpgArr[$key]; 
} 

Это должно сделать это. жаль, что раньше я не был более конкретным. (Я не тестировал это, но должен работать)

+0

Что? Должно ли это правильно сортировать, используя магическую пыль? – Jon

+0

Никакой волшебный пикси-пылевой чувак, asort() сортирует массив по алфавиту и arsort() сортирует его в обратном порядке. Реальный простой.Я буду расширять свой ответ, поскольку он многомерный. –

+1

При расширении ответа уделите особое внимание тому факту, что 'asort' и' arsort' никогда не смогут работать здесь, потому что a) этот массив является многомерным и b) они не могут одновременно используйте несколько критериев. Чувак. – Jon

Смежные вопросы