[英]Sort an array by value/key - mix of string and numeric values PHP
我需要對數組進行排序。 值和鍵都是相同的,都是字符串。 基本上,數組看起來類似於:
$test = array(
'1' => '1',
'2' => '2',
'1.5' => '1.5',
'3' => '3',
'4' => '4',
'3.5' => '3.5',
'2XS' => '2XS',
'2XL' => '2XL',
'XXL' => 'XXL',
);
預期 Output:
Array
(
[0] => 1
[1] => 1.5
[2] => 2
[5] => 3
[6] => 3.5
[7] => 4
[3] => 2XL
[4] => 2XS
[8] => XXL
)
有任何想法嗎?
<?php
$test = array(
'1' => '1',
'2' => '2',
'1.5' => '1.5',
'3' => '3',
'4' => '4',
'3.5' => '3.5',
'2XS' => '2XS',
'2XL' => '2XL',
'XXL' => 'XXL',
);
$numericArray=array();
$stringsArray=array();
array_map(function($value) use (&$numericArray,&$stringsArray) {
if(is_numeric($value))
{
$numericArray[]=$value;//Here we are putting numeric values
}
else
{
$stringsArray[]=$value;//Here we are putting string values
}
}, $test);
sort($numericArray,SORT_NUMERIC);//sorting on numeric basis
sort($stringsArray,SORT_REGULAR);//sorting on string basis
$result=array_merge($numericArray,$stringsArray);//merging both of them
print_r($result);
輸出:
Array
(
[0] => 1
[1] => 1.5
[2] => 2
[3] => 3
[4] => 3.5
[5] => 4
[6] => 2XL
[7] => 2XS
[8] => XXL
)
<?php
$test = array(
'1' => '1',
'2' => '2',
'1.5' => '1.5',
'3' => '3',
'4' => '4',
'3.5' => '3.5',
'2XS' => '2XS',
'2XL' => '2XL',
'XXL' => 'XXL',
);
function sortNandS($array){
$nums = [];
$strings = [];
foreach($array as $elm) {
is_numeric($elm) ? $nums[]= $elm : $strings[]=$elm;
}
sort($nums,SORT_NUMERIC);
sort($strings,SORT_REGULAR);
$result=array_merge($nums,$strings);
return $result;
}
print_r(sortNandS($test));
使用usort
, is_numeric
和strcmp
函數的解決方案:
usort($test, function ($a, $b) {
if (is_numeric($a) && is_numeric($b)) {
return $a - $b;
} else if (is_numeric($a) && !is_numeric($b)) {
return -1;
} else if (!is_numeric($a) && is_numeric($b)) {
return 1;
} else {
return strcmp($a, $b);
}
});
print_r($test);
輸出:
Array
(
[0] => 1
[1] => 1.5
[2] => 2
[3] => 3
[4] => 3.5
[5] => 4
[6] => 2XL
[7] => 2XS
[8] => XXL
)
使用array_multisort()
比以前發布的任何答案更有效。 通過傳遞一個is_numeric()
返回值數組作為第一個參數,您的腳本將享受較低的時間復雜度,因為is_numeric()
調用將為n 。 相比之下, usort()
將調用is_numeric()
2 * n log n (效率較低)。
代碼:(演示)
array_multisort(
array_map('is_numeric', $test),
SORT_DESC,
$test
);
如果你想看看等價的usort()
是什么樣子的:( Demo )
usort(
$test,
fn($a, $b) => [is_numeric($b), $a] <=> [is_numeric($a), $b]
);
與uasort()
和array_multisort()
不同, usort()
將在修改后重新索引數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.