我希望能够在多列上对关联数组进行排序。为了使其更加复杂,我希望能够为每个键/列设置特定的排序选项。我有一组与数据库查询的结果集相似的数据,但实际上并非来自一个数据集,因此我需要使用PHP而不是SQL对其进行排序。
[
['first_name' => 'Homer', 'last_name' => 'Simpson', 'city' => 'Springfield', 'state' => 'Unknown', 'zip' => '66735'],
['first_name' => 'Patty', 'last_name' => 'Bouvier', 'city' => 'Scottsdale', 'state' => 'Arizona', 'zip' => '85250'],
['first_name' => 'Moe', 'last_name' => 'Szyslak', 'city' => 'Scottsdale', 'state' => 'Arizona', 'zip' => '85255'],
['first_name' => 'Nick', 'last_name' => 'Riviera', 'city' => 'Scottsdale', 'state' => 'Arizona', 'zip' => '85255'],
];
我希望能够对它进行类似于数据库查询的排序。哦,有时需要按数字指定列/键。
我想到的是类似的东西:
$sortOptions = array(
array( 'city', SORT_ASC, SORT_STRING),
array( 'zip', SORT_DESC, SORT_NUMERIC),
array( 2, SORT_ASC, SORT_STRING) // 2='last_name'
);
$sorter = new MultiSort($data, $sortOptions);
$sortedData = $sorter->getSortedArray();
print_r($jmsSorted);
我想最后得到的是:
Array
(
[0] => Array
(
[first_name] => Nick
[last_name] => Riviera
[city] => Scottsdale
[state] => Arizona
[zip] => 85255
)
[1] => Array
(
[first_name] => Moe
[last_name] => Szyslak
[city] => Scottsdale
[state] => Arizona
[zip] => 85255
)
[2] => Array
(
[first_name] => Patty
[last_name] => Bouvier
[city] => Scottsdale
[state] => Arizona
[zip] => 85250
)
[3] => Array
(
[first_name] => Homer
[last_name] => Simpson
[city] => Springfield
[state] => Unknown
[zip] => 66735
)
)
UPDATE:我认为理想情况下,一种解决方案将导致动态创建
array_multisort( $city, SORT_ASC, SORT_STRING, $zip, SORT_DESC, SORT_NUMERIC, $last_name, SORT_ASC, SORT_STRING, $inputArray);
问题是我不想在其中“硬编码”那些键名。我尝试根据最终使用array_multisort()
的array_multisort()
文档中的示例#3对数据库结果进行排序创建一个解决方案,但是我似乎找不到找到将动态构建的参数列表用于array_multisort()
的方法。
我的尝试是将这些参数“链接”到一个数组中,然后
array_multisort()
导致出现
警告:array_multisort()的参数2有望作为参考,值在...中给出>]
我希望能够在多列上对关联数组进行排序。为了使其更加复杂,我希望能够为每个键/列设置特定的排序选项。我有一组数据...
在PHP 5.3中,使用call_user_func_array( 'array_multisort', $functionArgs);
调用array_multisort()
时,数组中的每个参数都必须是引用。
这应该适合您所描述的情况。
您可能想尝试使用array_multisort()
。您所要做的就是创建一个告诉分类器如何对其进行分类的函数。该文档具有有关如何执行此操作的更多信息。
这是我最终决定能够对多维数组进行排序的内容。上面的两个答案都不错,但我也在寻找一些灵活的方法。
[我已经看到了许多在http://www.php.net/manual/en/function.usort.php#104398内使用/**
* Sort the resultSet.
*
* Usage: $sortOptions = array(
* 'section', // Defaults to SORT_ASC
* 'row' => SORT_DESC,
* 'retail_price' => SORT_ASC);
* $results->sortResults($sortOptions);
*
* @param array $sortOptions An array of sorting instructions
*/
public function sortResults(array $sortOptions)
{
usort($this->_results, $this->_usortByMultipleKeys($sortOptions));
}
/**
* Used by sortResults()
*
* @link http://www.php.net/manual/en/function.usort.php#103722
*/
protected function _usortByMultipleKeys($key, $direction=SORT_ASC)
{
$sortFlags = array(SORT_ASC, SORT_DESC);
if (!in_array($direction, $sortFlags)) {
throw new InvalidArgumentException('Sort flag only accepts SORT_ASC or SORT_DESC');
}
return function($a, $b) use ($key, $direction, $sortFlags) {
if (!is_array($key)) { //just one key and sort direction
if (!isset($a->$key) || !isset($b->$key)) {
throw new Exception('Attempting to sort on non-existent keys');
}
if ($a->$key == $b->$key) {
return 0;
}
return ($direction==SORT_ASC xor $a->$key < $b->$key) ? 1 : -1;
} else { //using multiple keys for sort and sub-sort
foreach ($key as $subKey => $subAsc) {
//array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which
if (!in_array($subAsc, $sortFlags)) {
$subKey = $subAsc;
$subAsc = $direction;
}
//just like above, except 'continue' in place of return 0
if (!isset($a->$subKey) || !isset($b->$subKey)) {
throw new Exception('Attempting to sort on non-existent keys');
}
if ($a->$subKey == $b->$subKey) {
continue;
}
return ($subAsc==SORT_ASC xor $a->$subKey < $b->$subKey) ? 1 : -1;
}
return 0;
}
};
}
的Stack Overflow解决方案,但是从PHP5.6起,splat运算符可以取消嵌套排序功能并允许对其进行独占调用。