2017-04-12 48 views
1

我需要對數組進行排序。值和鍵都是相同的,都是字符串。基本上,陣列類似於此:按值/鍵排序數組 - 字符串和數值的混合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', 
    ); 

預期輸出:

Array 
(
    [0] => 1 
    [1] => 1.5 
    [2] => 2 
    [5] => 3 
    [6] => 3.5 
    [7] => 4 
    [3] => 2XL 
    [4] => 2XS 
    [8] => XXL 
) 

任何想法?

+1

任何嘗試??我們不需要重新發明輪子 – hassan

+0

我嘗試使用sort()進行自然排序,以至於不會有太大的幫助。我是一個完整的小白。 – dodo254

回答

4

PHP code demo

<?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 
) 
+0

爲什麼不只是'foreach'? 'array_map'使這種方式更復雜,然後它需要。 – nerdlyist

+0

@nerdlyist是的,我可以使用'foreach'是正確的,但通常我使用'array_map'。以上結果可以通過不同的方法來實現。但我遵循這一點,這不是一個問題。 –

+0

@nerdlyist這可能是一個案例,如果任何人不是'array_map'的家庭比看到這個人會學習一個新的功能:) –

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

@SahilGulati解決方案絕對沒有錯,這與'function'和'foreach'非常相似。 – nerdlyist

1

使用該溶液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 
)