PHP Conference Japan 2024

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 此函数现在使用标准的 PHP 8 规则在 SORT_REGULAR 下进行数值字符串比较。

示例

示例 #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 条

8
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);

结果

Array
(
[-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);

结果

Array
(
[-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);

结果

Array
(
[-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);

结果

Array
(
[-5] => minus five
[0] => zero
[1] => one
[2] => two
[100] => hundred
)
50
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"
}

没有检查您的数组键是否存在,或者您要搜索的数组数据是否实际存在,但添加起来很容易。
14
thegrandoverseer
12 年前
我写了这个函数来按顺序使用键名数组对数组的键进行排序。
<?php
/**
* 函数 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'); //返回 array('baz'=>'foo', 'foo'=>'bar', 'bar'=>'baz', 'someotherkey'=>'whatev', 'anotherkey'=>'anotherval' );
?>
12
匿名
22 年前
这里有两个函数可以对数组及其所有成员数组进行 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);
}
}
}
7
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;
}
2
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
*/
?>
5
sbarnum at mac dot com
23 年前
对具有负整数作为键的数组进行 ksort 会产生一些奇怪的结果。不确定这是个坏主意(负键值)还是什么。
9
delvach at mail dot com
23 年前
对按字符串键控的数组进行不区分大小写排序的一种非常快速的方法

uksort($myArray, "strnatcasecmp");
10
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"
}
}
5
匿名用户
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"
?>
2
匿名用户
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));

?>
2
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;
}
-2
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);
?>

产生(在带有 Suhosin-Patch 的 PHP 5.3.6-4 上)

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"
}

请注意,第二个数组应该按键排序,但比第一个数组更乱!
-1
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)
-3
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 时会丢失信息。
-5
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

解决方案

函数 array_sort($arr){
如果 (is_array($arr)){
$numeric = array();
$string = array();
遍历 ($arr as $k => $v)
{
如果 (isset($v["meta_value"])){
$str = explode(" ",trim($v["meta_value"]));
$firstWord = explode("-",trim($str[0]));
}否则 {
$str = $v;
$firstWord = explode("-",trim($str));
}

$firstWord = $firstWord[0];

如果 (is_numeric($firstWord))
{
$numeric[(int)$firstWord] = $v;
}否则 {
$string[$firstWord] = $v;
}
unset($firstWord);
}
ksort($string,SORT_STRING);
ksort($numeric,SORT_NUMERIC);

返回 array_merge((array)$string, (array)$numeric);
}


返回 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