php — повторная сортировка массива

#php #arrays #sorting #grouping

#php #массивы #сортировка #группировка

Вопрос:

У меня есть массив записей, разделенных годом и месяцем, как показано ниже. Мне нужно отсортировать этот массив так, чтобы записи были «сгруппированы» по годам, а затем по категориям.

 Array
(
    [Oct 2011] => Array
        (
            [0] => Array
                (
                    [title] => CAD Drawing Updates
                    [file] => /gm-June2010-driver.pdf
                    [category] => Windows
                )
        )


    [Sep 2011] => Array
        (
            [0] => Array
                (
                    [title] => title
                    [file] => /gm-June2010-driver.pdf
                    [category] => Windows
                )

            [1] => Array
                (
                    [title] => edges
                    [file] => /gm-June2010-driver.pdf
                    [category] =>Walling
                )

            [2] => Array
                (
                    [title] => Specification update
                    [file] => /gm-June2010-driver.pdf
                    [category] => Windows
                )
        )
)
  

Так что это то, что мне нужно.

 Array
(
    [Oct 2011] => Array
        (
                [Windows] => Array
                        (
                            [0] => Array
                                (
                                    [title] => CAD Drawing Updates
                                    [file] => /gm-June2010-driver.pdf
                                )                       
                        )
        )


    [Sep 2011] => Array
        (
                [Windows] => Array
                                (
                            [0] => Array
                                (
                                    [title] => title
                                    [file] => /gm-June2010-driver.pdf
                                    [category] => Windows
                                )


                            [1] => Array
                                (
                                    [title] => Specification update
                                    [file] => /gm-June2010-driver.pdf
                                    [category] => Windows
                                )                                                               
                                )   
                [Walling] => Array
                                (
                            [0] => Array
                                (
                                    [title] => edges
                                    [file] => /gm-June2010-driver.pdf
                                    [category] => Curtain Walling
                                )                                                               
                                )                                            
        )
)
  

Я не уверен, что это задание для функций сортировки, любая помощь будет оценена, спасибо.

Комментарии:

1. Это не повторная сортировка, а повторный ввод ключа.

2. Нет, это не работа для функций сортировки и вообще не сортировка. Просто перебирайте свой массив и группируйте записи, как вам нравится

Ответ №1:

Нет, это невозможно сделать с помощью функции сортировки, вам нужно создать новый массив, выполнив итерацию по исходному массиву с помощью вложенных циклов foreach .

 $newArr = array();
foreach($arr as $month => items) {
  foreach($items as $data) {
    $newArr[$month][$data["category"]][] = $data;
  }
}
  

Ответ №2:

Вы не хотите сортировать, а просто переименовывать ключи. PHP-массивы не поддерживают переименование ключей напрямую, поэтому сначала вам нужно создать новый массив, который будет построен с использованием новых ключей при сохранении существующих значений.

В конце вы можете заменить исходный массив на новый:

 $rekeyed = array();
foreach($array as $monthYear => amp;$value)
{
    $r = sscanf($monthYear, '%s %d', $month, $year);
    if ($r != 2) throw new Exception(sprintf('Invalid Key "%s".', $monthYear));
    $categories = array();
    foreach($value as amp;$item)
    {
        $category =amp; $item['category'];
        unset($item['category']);
        $categories[$category][] =amp; $item;
    }
    unset($item);
    $value =amp; $categories;
    unset($categories);    
    $rekeyed[$year][$month] =amp; $value;
}
unset($value);
$array =amp; $rekeyed;
unset($rekeyed);
print_r($array);
  

Вывод:

 Array
(
    [2011] => Array
        (
            [Oct] => Array
                (
                    [Windows] => Array
                        (
                            [0] => Array
                                (
                                    [title] => CAD Drawing Updates
                                    [file] => /gm-June2010-driver.pdf
                                )

                        )

                )

            [Sep] => Array
                (
                    [Windows] => Array
                        (
                            [0] => Array
                                (
                                    [title] => title
                                    [file] => /gm-June2010-driver.pdf
                                )

                        )

                    [Walling] => Array
                        (
                            [0] => Array
                                (
                                    [title] => edges
                                    [file] => /gm-June2010-driver.pdf
                                )

                        )

                )

        )

)
  

ДЕМОНСТРАЦИЯ

Ответ №3:

Я думаю, что функция, на которую вы должны обратить внимание, — это uasort .

http://www.php.net/manual/en/function.uasort.php

Сначала выполните сортировку в основном массиве, затем для каждого элемента в массиве выполните usort в дочернем массиве.