Case使用array_multisort()对多维PHP数组进行不敏感排序

时间:2014-11-26 04:26:36

标签: php arrays sorting case-insensitive

经过大量搜索后,我无法找到一个很好的解释,说明如何使用array_multisort()来对多维数组进行不敏感的排序。在处理来自数据库查询的信息时,我发现这是一个非常有用的功能,以为我会分享。

3 个答案:

答案 0 :(得分:7)

我应该注意这只适用于php 5.4 +

# Example results from database
$PDOresult = array(
    array('name' => 'Alpha', 'price' => '10'),
    array('name' => 'beta', 'price' => '12'),
    array('name' => 'Gamma', 'price' => '14'),
    array('name' => 'delta', 'price' => '16'),
    array('name' => 'Epsilon', 'price' => '18'),
    array('name' => 'zeta', 'price' => '20'),
    ...
);

# Create array of field to sort by - 'name' in this example
foreach ($PDOresult as $key => $row) {
    $sort_by[$key] = $row['name'];
}

# Sort array - The flags SORT_NATURAL & SORT_FLAG_CASE are required to make the
# sorting case insensitive.
array_multisort($sort_by, SORT_ASC|SORT_NATURAL|SORT_FLAG_CASE, $PDOresult);

# Output
var_dump($PDOresult);

如果使用php 5.5+,您可以跳过foreach()并使用array_column()代替。像这样:

$sort_by = array_column($PDOresult, 'name');

我很想把它编辑成一个写得很好的答案:How can I sort arrays and data in PHP?但是我并不想搞砸格式化,所以如果有人想这样做并关闭它,那对我来说就没那问了

答案 1 :(得分:3)

@damndaewoo

SORT_ASC|SORT_NATURAL|SORT_FLAG_CASE

在某些情况下会给你:

Warning: array_multisort(): Argument #2 is an unknown sort flag 

正如文档中所说here你应该使用','而不是' |' 但是你不能做到以下几点:

  

SORT_ASC,SORT_NATURAL,SORT_FLAG_CASE   因为你会得到一个意外的:

Argument #4 is expected to be an array or sorting flag that has not already been specified

相反,您将使用以下两种技术:

  

array_multisort($sort_by, SORT_ASC,SORT_NATURAL|SORT_FLAG_CASE, $PDOresult);

答案 2 :(得分:0)

您也可以简单地这样做:

foreach ($PDOresult as $key => $row) {
    $sort_by[$key] = strtolower($row['name']);
}

array_multisort($sort_by, SORT_ASC, $PDOresult);

不需要特殊的标志,因为排序的所有内容都是小写的。如果您担心UTF-8,请改用mb_strtolower()。 这将与带有特殊标志的解决方案具有相同的结果,但我认为更加直观。