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 此函數現在在 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 個附註

8
orlov0562 at gmail dot com
7 年前
我沒在描述中找到的第一件事是,此函數會回傳從最小值到最大值的結果,例如:[-5=>'', 0=>'', 5=>'' ]

您也應該知道,預設情況下,它會針對以字串表示但以數字作為值的鍵進行正確排序,例如:['-5'=>'', '0'=>'', '5'=>'' ]

以下是一些帶有結果的範例

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

描述:鍵名為數字 + 預設旗標 (SORT_REGULAR)

$arr = [
-5 => '負五',
0 => '零',
1 => '一',
2 => '二',
100 => '一百',
];

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

結果

陣列
(
[-5] => 負五
[0] => 零
[1] => 一
[2] => 二
[100] => 一百
)

-----------------------------------------
描述:鍵名為字串數字 + 預設旗標 (SORT_REGULAR)

$arr = [
'-5' => '負五',
'0' => '零',
'1' => '一',
'2' => '二',
'100' => '一百',
];

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

結果

陣列
(
[-5] => 負五
[0] => 零
[1] => 一
[2] => 二
[100] => 一百
)

-----------------------------------------
描述:鍵名為字串數字 + SORT_STRING 旗標

$arr = [
'-5' => '負五',
'0' => '零',
'1' => '一',
'2' => '二',
'100' => '一百',
];

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

結果

陣列
(
[-5] => 負五
[0] => 零
[1] => 一
[100] => 一百
[2] => 二
)

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

描述:鍵名為字串數字 + SORT_NUMERIC 旗標

$arr = [
'-5' => '負五',
'0' => '零',
'1' => '一',
'2' => '二',
'100' => '一百',
];

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

結果

陣列
(
[-5] => 負五
[0] => 零
[1] => 一
[2] => 二
[100] => 一百
)
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
/**
* function array_reorder_keys
* 按照指定的鍵名順序重新排列陣列的鍵;所有不在 $keynames 中的其他節點將在最後一個 $keyname 之後,以正常的陣列順序排列
* @param array &$array - 要重新排列的陣列
* @param mixed $keynames - 一個以逗號分隔或陣列形式的鍵名,按鍵應重新排序的順序排列
*/
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' );
?>
12
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);
}
}
}
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
Anonymous
11 年前
請注意,此函式會依照欄位加入資料陣列的順序輸出,而不是依照數字鍵的順序自動輸出。

若要依照鍵的遞增順序輸出,您需要先使用 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
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));

?>
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

解決方案

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