#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 в дочернем массиве.