У меня есть следующий многомерный массив PHP, который должен быть отсортирован / сгруппирован определенным образом: каждый дочерний массив должен быть сгруппирован по имени, а дочерний массив, где заполнен "nr"
, должен быть сверху. Я попробовал array_multisort
и usort
, но не смог заставить его работать идеально. После группировки / сортировки в этом примере необходимо поменять местами только индексы 0 и 1.
Array (
[0] => Array( "name" => "Test",
"address" => "test address",
"nr" =>
),
[1] => Array( "name" => "Test",
"address" => "test address",
"nr" => 100
),
[2] => Array( "name" => "Test1",
"address" => "test1 address",
"nr" => 180
),
[3] => Array( "name" => "Test2",
"address" => "test2 address",
"nr" => 250
)
)
Мультисортировка массива:
array_multisort(array_column($arr, 'name'), SORT_ASC, array_column($arr, 'deb_nr'), SORT_ASC, $arr);
Мультисортировка массива с функцией обратного вызова:
$arr = $this->arrayOrderBy($arr, 'name', SORT_ASC, 'nr', SORT_ASC);
private function arrayOrderBy()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}