簡體   English   中英

按值/鍵對數組進行排序 - 字符串和數值的混合 PHP

[英]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代碼演示

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

使用usortis_numericstrcmp函數的解決方案:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM