Как отсортировать массив, как MySQL
Как отсортировать массив, который совпадает с данными базы данных?
Я запросил данные Google Analytics, данные представляют собой массив larget, я хочу объединить массив с некоторыми другими полями из моей локальной базы данных, а затем снова расширить большой массив. Теперь я хочу отсортировать большой массив, который совпадает с использованием моего sql следующим образом:
select * from ga_table where ...
select * from ga_table order by age
select * from ga_table group by name
мой массив сейчас выглядит так:
$arr=array(
'header'=>array('name','age','money'),
'values'=>array(
array('jimmy',20,30),
array('tina',18,12),
array('darcy',19,50),
)
);
но теперь у меня был большой массив, а не таблица БД, тогда как сортировать массив?
3 ответа
Ты можешь попробовать array_multisort
: http://php.net/manual/en/function.array-multisort.php
foreach ($arr['values'] as $key => $row) {
$name[$key] = $row[0];
$age[$key] = $row[1];
$money[$key] = $row[3];
}
Теперь, если вы хотите отсортировать по имени в ASC, вы можете:
array_multisort($name, SORT_ASC, $arr['values']);
или по имени DESC:
array_multisort($name, SORT_DESC, $arr['values']);
или возраст ASC:
array_multisort($age, SORT_ASC, $arr['values']);
или возраст DESC и имя ASC
array_multisort($age, SORT_DESC, $name, SORT_ASC, $arr['values']);
asort();
arsort();
krsort();
и т.д.. все это встроенные функции PHP, используемые для сортировки массива.
Для лучшего понимания вы можете перейти по ссылке http://php.net/manual/en/array.sorting.php
Спасибо @mamdouh alramadan!
Я написал вспомогательную функцию для сортировки массива, такого как MySQL
function arrayOrderBy(array $items, array $orderBy)
{
if (empty($items) || empty($orderBy)) {
return $items;
}
$multisortArgs = [];
foreach ($orderBy as $field => $direction) {
$columnValues = array_column($items, $field);
if (empty($columnValues)) {
continue;
}
$multisortArgs[] = $columnValues;
$multisortArgs[] = strtoupper($direction) === 'ASC' ? SORT_ASC : SORT_DESC;
}
if (empty($multisortArgs)) {
return $items;
}
$multisortArgs[] = &$items;
call_user_func_array('array_multisort', $multisortArgs);
return $items;
}
Применение
$data[] = array('volume' => 67, 'edition' => 7);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 2);
$sorted = arrayOrderBy($data, ['volume' => 'desc', 'edition' => 'asc']);
print_r($sorted);
И вывод:
Array
(
[0] => Array
(
[volume] => 98
[edition] => 2
)
[1] => Array
(
[volume] => 86
[edition] => 1
)
[2] => Array
(
[volume] => 86
[edition] => 6
)
[3] => Array
(
[volume] => 85
[edition] => 6
)
[4] => Array
(
[volume] => 67
[edition] => 2
)
[5] => Array
(
[volume] => 67
[edition] => 7
)
)