ksort

(PHP 4, PHP 5, PHP 7, PHP 8)

ksort按键升序排列数组

说明

ksort(array &$array, int $flags = SORT_REGULAR): true

按键升序排列 array

注意:

如果两个成员比较相等,它们将保留其原始顺序。在 PHP 8.0.0 之前,它们在排序数组中的相对顺序是不确定的。

注意:

将数组的内部指针重置为第一个元素。

参数

array

输入数组。

flags

可选的第二个参数 flags 可用于使用以下值修改排序行为

排序类型标志

返回值

始终返回 true

变更日志

版本 说明
8.2.0 返回值类型现在为 true;以前是 bool
8.2.0 此函数现在在 SORT_REGULAR 下使用标准 PHP 8 规则进行数字字符串比较。

范例

示例 #1 ksort() 示例

<?php
$fruits
= array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
foreach (
$fruits as $key => $val) {
echo
"$key = $val\n";
}
?>

上面的示例将输出

a = orange
b = banana
c = apple
d = lemon

示例 #2 ksort()int

<?php
$a
= [0 => 'First', 2 => 'Last', 1 => 'Middle'];
var_dump($a);
ksort($a);
var_dump($a);
?>

上面的示例将输出

array(3) {
  [0]=>
  string(5) "First"
  [2]=>
  string(4) "Last"
  [1]=>
  string(6) "Middle"
}
array(3) {
  [0]=>
  string(5) "First"
  [1]=>
  string(6) "Middle"
  [2]=>
  string(4) "Last"
}

参见

添加说明

用户贡献说明 16 个说明

orlov0562 at gmail dot com
7 年前
我在描述中没有找到的第一件事是,此函数返回的结果从最小值到最大值,例如:[-5=>'', 0=>'', 5=>'' ]

您还应该知道,默认情况下,它对作为字符串表示但值为数字的键具有正确的排序,例如:['-5'=>'', '0'=>'', '5'=>'' ]

几个带有结果的示例

-----------------------------------------

描述:键是数字 + 默认标志 (SORT_REGULAR)

$arr = [
-5 => 'minus five',
0 => 'zero',
1 => 'one',
2 => 'two',
100 => 'hundred',
];

ksort($arr);
print_r($arr);

结果

数组
(
[-5] => minus five
[0] => zero
[1] => one
[2] => two
[100] => hundred
)

-----------------------------------------
描述:键是字符串数字 + 默认标志 (SORT_REGULAR)

$arr = [
'-5' => 'minus five',
'0' => 'zero',
'1' => 'one',
'2' => 'two',
'100' => 'hundred',
];

ksort($arr);
print_r($arr);

结果

数组
(
[-5] => minus five
[0] => zero
[1] => one
[2] => two
[100] => hundred
)

-----------------------------------------
描述:键是字符串数字 + SORT_STRING 标志

$arr = [
'-5' => 'minus five',
'0' => 'zero',
'1' => 'one',
'2' => 'two',
'100' => 'hundred',
];

ksort($arr, SORT_STRING);
print_r($arr);

结果

数组
(
[-5] => minus five
[0] => zero
[1] => one
[100] => hundred
[2] => two
)

-----------------------------------------

描述:键是字符串数字 + SORT_NUMERIC 标志

$arr = [
'-5' => 'minus five',
'0' => 'zero',
'1' => 'one',
'2' => 'two',
'100' => 'hundred',
];

ksort($arr, SORT_NUMERIC);
print_r($arr);

结果

数组
(
[-5] => minus five
[0] => zero
[1] => one
[2] => two
[100] => hundred
)
DavidG
14 年前
一种对多维数组的键进行排序的好方法,而不必事先知道数组中有哪些键

<?php
$people
= array(
array(
"name"=>"Bob","age"=>8,"colour"=>"red"),
array(
"name"=>"Greg","age"=>12,"colour"=>"blue"),
array(
"name"=>"Andy","age"=>5,"colour"=>"purple"));

var_dump($people);

$sortArray = array();

foreach(
$people as $person){
foreach(
$person as $key=>$value){
if(!isset(
$sortArray[$key])){
$sortArray[$key] = array();
}
$sortArray[$key][] = $value;
}
}

$orderby = "name"; //将此更改为数组中所需的任何键

array_multisort($sortArray[$orderby],SORT_DESC,$people);

var_dump($people);
?>

第一个 var_dump 的输出

[0]=&gt;
array(3) {
["name"]=&gt;
string(3) "Bob"
["age"]=&gt;
int(8)
["colour"]=&gt;
string(3) "red"
}
[1]=&gt;
array(3) {
["name"]=&gt;

string(4) "Greg"
["age"]=&gt;
int(12)
["colour"]=&gt;
string(4) "blue"
}
[2]=&gt;
array(3) {
["name"]=&gt;
string(4) "Andy"
["age"]=&gt;
int(5)
["colour"]=&gt;

string(6) "purple"
}
}

来自第二个 var_dump 的输出

array(3) {
[0]=&gt;
array(3) {
["name"]=&gt;
string(4) "Greg"
["age"]=&gt;
int(12)
["colour"]=&gt;
string(4) "blue"
}
[1]=&gt;
array(3) {
["name"]=&gt;

string(3) "Bob"
["age"]=&gt;
int(8)
["colour"]=&gt;
string(3) "red"
}
[2]=&gt;
array(3) {
["name"]=&gt;
string(4) "Andy"
["age"]=&gt;
int(5)
["colour"]=&gt;

string(6) "purple"
}

没有检查数组键是否存在,或者您正在搜索的数组数据是否确实存在,但这很容易添加。
thegrandoverseer
12 年前
我编写了这个函数,用于使用一个键名数组按顺序对数组的键进行排序。
<?php
/**
* function array_reorder_keys
* 按指定的键名顺序重新排列数组的键;所有不在 $keynames 中的节点都将在最后一个 $keyname 之后,按照正常的数组顺序
* @param array &$array - 要重新排序的数组
* @param mixed $keynames - 按顺序重新排列键的键名的 csv 或数组
*/
function array_reorder_keys(&$array, $keynames){
if(empty(
$array) || !is_array($array) || empty($keynames)) return;
if(!
is_array($keynames)) $keynames = explode(',',$keynames);
if(!empty(
$keynames)) $keynames = array_reverse($keynames);
foreach(
$keynames as $n){
if(
array_key_exists($n, $array)){
$newarray = array($n=>$array[$n]); //复制节点,然后取消设置
unset($array[$n]); //删除节点
$array = $newarray + array_filter($array); //将复制与过滤后的数组合并
}
}
}
$seed_array = array('foo'=>'bar', 'someotherkey'=>'whatev', 'bar'=>'baz', 'baz'=>'foo', 'anotherkey'=>'anotherval');
array_reorder_keys($seed_array, 'baz,foo,bar'); //返回数组('baz'=>'foo', 'foo'=>'bar', 'bar'=>'baz', 'someotherkey'=>'whatev', 'anotherkey'=>'anotherval' );
?>
Anonymous
22 年前
这里有 2 个函数用于 ksort/uksort 数组及其所有成员数组

function tksort(&$array)
{
ksort($array);
foreach(array_keys($array) as $k)
{
if(gettype($array[$k])=="array")
{
tksort($array[$k]);
}
}
}

function utksort(&$array, $function)
{
uksort($array, $function);
foreach(array_keys($array) as $k)
{
if(gettype($array[$k])=="array")
{
utksort($array[$k], $function);
}
}
}
ssb45 at cornell dot edu
19 年前
justin at booleangate dot org 提供的函数工作良好,但请注意,它不是 ksort 的直接替换。虽然 ksort 按引用对数组进行排序并返回状态布尔值,但 natksort 返回排序后的数组,而原始数组保持不变。因此,您必须使用以下语法

$array = natksort($array);

如果您想使用更自然的语法

$status = natksort($array);

然后使用此修改后的版本

function natksort(&$array) {
$keys = array_keys($array);
natcasesort($keys);

foreach ($keys as $k) {
$new_array[$k] = $array[$k];
}

$array = $new_array;
return true;
}
bimal at sanjaal dot com
10 年前
按域名名称对域名进行反向排序的示例。

<?php
$domains
= array(
'sub.domain.com',
'sub2.domain.com',
);

foreach(
$domains as $d => $domain)
{
$chunks = explode('.', $domain);
krsort($chunks);

echo
"\r\n<br>", implode('/', $chunks);
}

/**
* 输出为:
*
* com/domain/sub
* com/domain/sub2
*/
?>
sbarnum at mac dot com
22 年前
对包含负整数作为键的数组进行 ksort 会产生一些奇怪的结果。不确定这是个坏主意(负键值)还是什么。
delvach at mail dot com
22 年前
对按字符串键索引的数组进行不区分大小写排序的快速方法

uksort($myArray, "strnatcasecmp");
serpro at gmail dot com
15 年前
这是一个按其子数组的键对数组进行排序的函数。

<?php

function sksort(&$array, $subkey="id", $sort_ascending=false) {

if (
count($array))
$temp_array[key($array)] = array_shift($array);

foreach(
$array as $key => $val){
$offset = 0;
$found = false;
foreach(
$temp_array as $tmp_key => $tmp_val)
{
if(!
$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
{
$temp_array = array_merge( (array)array_slice($temp_array,0,$offset),
array(
$key => $val),
array_slice($temp_array,$offset)
);
$found = true;
}
$offset++;
}
if(!
$found) $temp_array = array_merge($temp_array, array($key => $val));
}

if (
$sort_ascending) $array = array_reverse($temp_array);

else
$array = $temp_array;
}

?>

示例
<?php
$info
= array("peter" => array("age" => 21,
"gender" => "male"
),
"john" => array("age" => 19,
"gender" => "male"
),
"mary" => array("age" => 20,
"gender" => "female"
)
);

sksort($info, "age");
var_dump($info);

sksort($info, "age", true);
var_dump($ifno);
?>

这将是示例的输出

/*降序排序*/
array(3) {
["peter"]=>
array(2) {
["age"]=>
int(21)
["gender"]=>
string(4) "male"
}
["mary"]=>
array(2) {
["age"]=>
int(20)
["gender"]=>
string(6) "female"
}
["john"]=>
array(2) {
["age"]=>
int(19)
["gender"]=>
string(4) "male"
}
}

/*升序排序*/
array(3) {
["john"]=>
array(2) {
["age"]=>
int(19)
["gender"]=>
string(4) "male"
}
["mary"]=>
array(2) {
["age"]=>
int(20)
["gender"]=>
string(6) "female"
}
["peter"]=>
array(2) {
["age"]=>
int(21)
["gender"]=>
string(4) "male"
}
}
Anonymous
11 年前
请注意,此函数将按添加到数据数组的顺序输出给定的 $fields,而不是自动按数字键顺序输出。

要按升序键顺序输出,您需要先对数组进行 ksort(或使用适当的自然顺序排序,具体取决于您的键)。

例如
<?php
$data
[2] = 'C';
$data[0] = 'A';
$data[1] = 'B';

fputcsv($fh, $data); // 输出:"C,A,B"

ksort($data);
fputcsv($fh, $data); // 输出:"A,B,C"
?>
Anonymous
10 年前
@thegrandoverseer

您也可以使用内置的 php 数组函数来获得您想要的确切结果

<?php
$seed_array
= array('foo'=>'bar', 'someotherkey'=>'whatev', 'bar'=>'baz', 'baz'=>'foo', 'anotherkey'=>'anotherval');
$keys_array = array('baz', 'foo', 'bar');

$return_array = array_intersect_key($seed_array, array_flip($keys_array)) + array_diff_key($seed_array, array_flip($keys_array));

?>
justin at booleangate dot org
19 年前
这是一个用于对键进行自然排序的实用函数。

function natksort($array) {
// 类似于 ksort,但使用自然排序而不是
$keys = array_keys($array);
natsort($keys);

foreach ($keys as $k)
$new_array[$k] = $array[$k];

return $new_array;
}
jakub dot lopuszanski at nasza-klasa dot pl
13 年前
请注意,如果数字键和字符串键混合在一起,ksort 不会对你有多大帮助。
<?php
$t
= array(
"a"=>"A",
0=>"A",
"b"=>"A",
1=>"A"
);
var_dump($t);
ksort($t);
var_dump($t);
?>

产生(在 PHP 5.3.6-4 与 Suhosin-Patch 上)

array(4) {
["a"]=>
string(1) "A"
[0]=>
string(1) "A"
["b"]=>
string(1) "A"
[1]=>
string(1) "A"
}

array(4) {
["b"]=>
string(1) "A"
[0]=>
string(1) "A"
["a"]=>
string(1) "A"
[1]=>
string(1) "A"
}

请注意,第二个数组应该按键排序,但比第一个数组更混乱!
maik dot riechert at animey dot net
16 年前
使用 ksort 时,要注意混合类型的键!!

$a = array(
'first' => true,
0 => 'sally',
);

$b = array(
0 => 'sally',
'first' => true,
);

ksort($a);
ksort($b);
var_dump($a);
var_dump($b);

输出为
array(
0 => 'sally',
'first' => true,
)

array(
'first' => true,
0 => 'sally',
)

如果你想让两个数组的结果相同,请使用

ksort($a, SORT_STRING);

出现这种情况的原因在于比较机制,通常它会在将 'first' 与另一个键进行比较时将其类型强制转换为整数或将 0 类型强制转换为字符串。因此,你必须使用 SORT_STRING,否则当 'first' 转换为 int 时会丢失信息。
stephen [ at ] brooksie-net [ dot ] co [ dot ] uk
11 年前
ksort 和 krsort 无法理解科学计数法,https://bugs.php.net/bug.php?id=43053, 因此,在对数字键进行排序时,如果键为 0.00001 形式,PHP 将将其表示为 1.0E-5。

这些方法会认为这是一个字符串,因此不会按照你的预期对数组进行排序。

使用此形式的值作为数组键时,请使用 sprintf('%f', 0.00001) 生成键,对于较小的值,需要包含精度
例如,sprintf('%0.10f', 0.00000001)
centraleffects at yahoo dot com
11 年前
我编写了这个函数来对 WordPress 中的 meta_value 进行排序。我尝试了许多数组排序方法,但没有一个奏效。但这不适合多维数组。它仅用于 WordPress 的 meta_value。

问题是排序如下(顺序应为升序;按字母顺序,然后按数字顺序,例如 A-Z,然后 0-9)
500-999 用户
25-49 用户
所有尺寸
1-4 用户
5-9 用户
10-24 用户
250-499 用户
1000-4999
5000-9999

解决方案

function array_sort($arr){
if(is_array($arr)){
$numeric = array();
$string = array();
foreach($arr as $k => $v)
{
if(isset($v["meta_value"])){
$str = explode(" ",trim($v["meta_value"]));
$firstWord = explode("-",trim($str[0]));
}else{
$str = $v;
$firstWord = explode("-",trim($str));
}

$firstWord = $firstWord[0];

if(is_numeric($firstWord))
{
$numeric[(int)$firstWord] = $v;
}else{
$string[$firstWord] = $v;
}
unset($firstWord);
}
ksort($string,SORT_STRING);
ksort($numeric,SORT_NUMERIC);

return array_merge((array)$string, (array)$numeric);
}


return false;
}

用法
$meta =get_post_meta($post_id,$meta_key);
$sorted = array_sort($meta);

结果
所有尺寸
1-4 用户
5-9 用户
10-24 用户
25-49 用户
250-499 用户
500-999 用户
1000-4999
5000-9999
To Top