How to sorting for humans (natural sort) an associative array in php?
以下代码:
$notSorted = array(
array('Title' => 'rose', 'Price' => 1.25, 'Number' => '10'),
array('Title' => 'daisy', 'Price' => 0.75, 'Number' => '1'),
array('Title' => 'orchid', 'Price' => 1.15, 'Number' => '7')
);
我敢打赌这里会进行排序:
foreach ( $notSorted as $val )
echo $val['Number'], " - ";
要输出:
10 -
1 -
7 -
以及如何对“数字”进行排序(对于人类)?喜欢:
1 -
7 -
10 -
另外,如果“Number”是一个整数怎么办,如果它是一个字符串怎么办?
你可以这样试试:
<?php
function record_sort($records, $field, $reverse=false)
{
$hash = array();
foreach($records as $record)
{
$hash[$record[$field]] = $record;
}
($reverse)? krsort($hash) : ksort($hash);
$records = array();
foreach($hash as $record)
{
$records []= $record;
}
return $records;
}
// Example below
$airports = array
(
array( "code" => "LHR", "name" => "Heathrow" ),
array( "code" => "LGW", "name" => "Gatwick" ),
);
printf("Before: <pre>%s</pre>", print_r($airports, true));
$airports = record_sort($airports, "name");
printf("After: <pre>%s</pre>", print_r($airports, true));
?>
Example Outputs:
Before: Array
(
[0] => Array ( [code] => LHR, [name] => Heathrow )
[1] => Array ( [code] => LGW, [name] => Gatwick )
)
After: Array
(
[0] => Array ( [code] => LGW, [name] => Gatwick )
[1] => Array ( [code] => LHR, [name] => Heathrow )
)
字段“Number”是字符串,所以它是一个字符一个字符地比较,而不是几千几千,然后是百乘百等等。
您可以编写自己的排序函数并将其与
usort
一起使用,或者将sort
与SORT_NUMERIC
一起使用,也许array_multi_sort
.
如果
Number
字段是整数(或浮点数),您可以只使用array_multisort
并指定要在Number
字段上排序。 http://php.net/manual/en/function.array-multisort.php 文档中的示例 #3 向您展示了如何为关联数组执行此操作。
如果
Number
是一个字符串,事情就更难了——在这种情况下,您必须进行“自然”排序,以确保“7”出现在“10”之前。如果您使用的是 PHP 5.4 或更高版本,则可以将 array_multisort
与 SORT_NATURAL
标志一起使用。
如果您使用的是 PHP 5.4 之前的版本,您可能必须使用 usort
和 strnatcmp
。有关如何执行此操作的详细信息,请参阅https://stackoverflow.com/a/11315019/26311。
如果您在
usort()
调用中使用三向比较运算符,数字字符串将自动作为数值进行比较。您不需要进行特殊声明或声明显式标志。
代码:(演示)
$array = [
['Title' => 'rose', 'Price' => 1.25, 'Number' => '10'],
['Title' => 'daisy', 'Price' => 0.75, 'Number' => '1'],
['Title' => 'orchid', 'Price' => 1.15, 'Number' => '7']
];
usort($array, fn($a, $b) => $a['Number'] <=> $b['Number']);
var_export($array);
输出:
array (
1 =>
array (
'Title' => 'daisy',
'Price' => 0.75,
'Number' => '1',
),
2 =>
array (
'Title' => 'orchid',
'Price' => 1.15,
'Number' => '7',
),
0 =>
array (
'Title' => 'rose',
'Price' => 1.25,
'Number' => '10',
),
)
相同行为的
array_multisort()
版本是:(Demo)
array_multisort(array_column($array, 'Number'), SORT_NUMERIC, $array);